隨著越來越多的應用程序運行在容器里,各種容器安全事件也隨之發生,例如攻擊者可以通過容器應用獲取容器控制權,利用失陷容器進行內網橫向,并進一步逃逸到宿主機甚至攻擊K8s集群。

容器的運行環境是相對獨立而純粹,當容器遭受攻擊時,急需對可疑的容器進行入侵排查以確認是否已失陷,并進一步進行應急處理和溯源分析找到攻擊來源。在應急場景下,使用docker命令可以最大程度利用docker自身的特性,快速的獲取相關信息而無需進入容器內部,幫助我們進行溯源分析和解決問題。

1.1 檢查容器運行情況

使用docker ps 查看當前運行的容器,創建時間、運行狀態、端口映射。

[root@ecs-t /]# docker psCONTAINER ID   IMAGE                          COMMAND                  CREATED             STATUS             PORTS                          NAMESb06352ff26cc   sagikazarmark/dvwa             "/run.sh"                About an hour ago   Up About an hour   3306/tcp, 0.0.0.0:81->80/tcp   dvwa

1.2 檢查運行容器詳細信息

使用docker inspect來獲取容器的詳細信息。

//獲取容器名docker inspect -f {{.Name}}  dvwa  
 //獲取容器網絡的相關信息docker inspect -f {{.NetworkSettings}} dvwa   docker inspect -f {{.NetworkSettings.IPAddress}} dvwa 
//目錄在宿主機的具體掛載位置docker inspect -f="{{json .Mounts}}" dvwa   docker inspect -f "{{range .Mounts}} {{println .Source .Destination}} {{end}}" dvwa
//查看網絡信息docker inspect -f="{{json .NetworkSettings}}" dvwa

1.3 檢查容器資源的使用情況

使用docker stats 查看容器的CPU、內存、網絡 I/O等情況,以確認是否存在資源異常的情況。

[root@ecs-t /]# docker stats dvwa
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O         PIDSb06352ff26cc   dvwa      0.00%     76.21MiB / 3.686GiB   2.02%     23.6kB / 57.6kB   24.1MB / 67.7MB   27

1.4 檢查容器中進程信息

使用docker top 查看容器中的進程信息,通過PID/PPID/CMD等信息來輔助定位異常進程。

如下圖:java父進程(PID:84010)觸發bash反彈shell的子進程(PID:84281)。

1.5 查看容器中日志

使用docker logs查看容器日志,并通過關鍵字定位異常信息位置。

如下圖:通過特征關鍵字找到可疑的jndi請求。

1.6 查看容器中的文件變化

使用docker diff命令可以找出容器內文件狀態變化。備注:三種狀態(A - Add, D - Delete, C - Change )。

如下圖:通過新增文件目錄快速定位webshell文件。

1.7 失陷容器應急處理

確認容器失陷后,一般我們可以采取暫停容器、隔離容器甚至殺死容器的方式來做緊急處理。

(1)使用docker pause,暫停容器中所有的進程。

(2)使用docker commit,用于將被入侵的容器來構建鏡像,從而保留現場痕跡,以便溯源。

(3)將正在運行的Docker容器禁用網絡。

//將運行中的容器與用戶定義的網橋斷開連接[root@localhost ~]#docker network disconnect bridge <container-name>
//禁用veth[root@localhost ~]#docker exec -it <container-name> cat /sys/class/net/eth0/iflink29[root@localhost ~]#ip link show |grep 2929: vethbf5239e@if28: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue masteefault [root@localhost ~]# ip link set vethbf5239e down

(4)使用docker kill 殺掉運行中的容器。

docker kill -s KILL <container-name>