 אז שלום לכולם, אני איטל, לא מספיק חזק, שלום לכולם, תראה טוב, חיית שתיים, שומעים, יופי. אז כמו שאמרתי אני איטל, טקניקה לידר בחברת Upset Clubs, כלנו דוחן בחוץ, זה מוזמנים לעבור. ההרצאה שלי היום תסוקרת בעצם דיקות Java Client Application, אנחנו פחות או יותר ננסה לרוץ פה על סיפור אמיתי של מקרה שקרה, ובעצם תיקחו את המצגת הזאתי או את ההרצאה הזאתי כמשל לבדיקות Client Security. אני עם בהרצאה הזאת מנסה לצור קצת בזמן אמת, מה קרה לי, בזמן הבדיקה, ואיך התמודדתי עם הבעיות שנתקלתי בהם. אנחנו נראה פה גם קלים, גם טכניקות לבדיקה של Java Client Application. דבר נציג אותי את החברה שאני עובד בה, אילו בעיות, אם אילו בעיות אנחנו נתמודד. מה קרה לי בפועל, ואיך נחשלתי במהלך הבדיקה עד שגעתי לפתרון הסופי, אני גאה לזה ככה. כמה מילים על Appsac Labs, סליחה, כמה מילים עליי. טכניקה לידר באפסק, עבדתי בעבר בחברות Amdox, Checkpoint והRSA. אתם כמובן מוזמנים לקוב אחרי באתר שלי, בהגיד. שם גם נראה לכם בסוף ההרצאה הכלי חדש שפיתחנו. בלינקטין, אני מרצה להקינג וסקירו קודינג, בנוסף מפתח קלים, וכמובן מוביל לצוות יועצים בחברת Appsac Labs, לבדיקות סקיורטי. מי אנחנו בעצם Appsac Labs, כמו שאשם מסגיר, אנחנו מתעסקים עם Application Security. אנחנו מבצעים מבדקי חדירות, הדרכות, פיתוח מובטח והקינג, גם למוביל, web, גם פרונטלי, גם e-learning, והם פתחים הרבה קלים. הקלים שלנו ברובה הם Open Source. אנחנו בחברת דוגלים בעברת הידע על הקהל, לצוות הצבטי הבדיקה, ואולי מפתחים. אתם יכולים לראות אותנו במרבית הכנסים של סקיורטי. אנחנו ארבע שנים ברציפות בבלקת מעבירים סדנת Hacking למוביל, גם Android וגם iOS. מתעסקים ברחב רחב של תחומים, מי שיצא לו לשמוע את ההרצאה המגניבה של ערב מטולה באודיטוריום על Hacking IOT, שבעצם מביא מציג מחקר רחב שעשינו בתקופה אחרונה לגבי IOT. ומילה אחרונה אנחנו מגייסים, אנחנו מגייסים, יועץ מנוסה, מי שזה מעניין אותו, יש לנו עמדה בחוץ, מי שרוצה לעשות זה בחשי, פשוט שהשלח מיל לכתובת הזאתי. ונתחיל רק לפני שאני מתחיל, מה בעצם אנחנו הולכים לעבור פה, אז פחות או יותר זה, אני מנסה לספר פה איזושהי סיפור של מקרה שקרה לי השנה, בעקבות רצון הנפגעים, הדמויות הוכלפו, השמות הוכלפו, הקלאסים הוכלפו, ניסינו לצור איזושהי אפליקציה שתדמה פחות או יותר, אפליקציה דמו שתדמה פחות או יותר, מה קרה. חוץ מזה, מי שיש לא רגישות למימס, אני לא רוצה לקחת החיות, אז אתם מתבקשים לעזוב. עם איזה בעיות אנחנו, על איזה בעיות אנחנו נדבר, תקשורת שהיא לא מבוסס את HDP, HDP זה קל, תקשורת מובטחת, מה קורה עם סרטיפיקי את פינינג, איך מבצעים רנטיימניפוליישן, איך עושים פאצ'ינג לאפליקאישן, וציג לכם כלי חדש שפיתחנו באפסק בסוף. ריק הקצר, הלכתי, הלכתי לבדיקת פנטסט רגילה, שלושה ימים צלקוח, מוצר ג'וב הקליינט אפליקאישן, מוצר סקיורטי, כמובן שאנחנו מטרה שלנו להשיג את מין על המערכת בסוף, וככה זה מתחיל פחות או יותר, יום ראשון אני מגיע, חבר'ה אין בעיה, יש לי כבר 10 שנים ניסיון בתחום, ראיתי הכל, אז אני מגיע, דבר ראשון, בוא נשים ברט, כולנו מכירים, החבר הכי טוב שלנו, בוא נשים ברט, נראה מה קורה, שאני כמה עוד דעות בדרך, כמה תעבורה בדרך, וכנראה שאני מצליח להשיג את מבוגשנו. שם, ברט, כלום לא קורה. טוב, בוא נראה למה לא קורה כלום, שתכל בוייר שער, כראה איזשהו פורט שקר כלשהו, לא על HCTP, אוקיי. יש גם כלים שיודעים להתמודד היום עם TCP, שהוא לא מבוסס HCTP, איזה כלים יש. לא יודע אם יוצא על האם אתם מכירים, יש כלי שנקרא אקומירז של חברת Wild Cove Security, משום בשנים האחרונות הלינק והטר נעלמו, אז שיהיה לכם בהצלחה להוריד את זה מפעלי פה, מציע לסרוק את המחשב אחר כך. כלי נוסף שיש, אדוונס פקט אדיטור, כלי שפותח או שודרג באפסק, באפסק לבס, לקחנו בעצם כלי חינמי פקט אדיטור, ווספנו לו כמה תוספות, אז מעבר לכך שהוא יודע פשוט לקח את סטרינגים בריספונס, ברקוויס, בית העבורת TCP ולהחליף אותם, ווספנו לו כמה תוספות נחמדות. אחד מהם זה פייטון. כולנו אוהבים פייטון בתור בודקים, מאוד קלי לכתוב סקריפטים פשוטים בפייטון ולבצע מניפולצות על הסטרינג. אז אחד הפייטשרים שהוספנו זה איזשהו פילטר שמדליקים. הדתה בקשה בעצם או התעבורה שיוצא, טוב מגיע אליכם כבר יבול שנקרא דתה, ובעצם תעשו עליו מה שאתם רוצים, רגול אקספרשט, תשלכו עוד בקשות, מה שאתם רוצים, ובעצם אפשר כך לעשות בקלות מניפולציה על התעבורה. פילטר נוסף שעשינו, יש היום את בר, אחד החברים הכי טובים כמו שאמרנו, יש לו כל כך הרבה יכולות. אז מה שלא נשתמש בהיכולות של בר, ולא נכתוב אותה מחדש, במקום נכתוב אותה מחדש. אז מה שעשינו זה, עשינו איזשהו פלג שאפשר להדליק, לוקחים את הבקשה הזאת עם הטיפי, שעמים אותה בבר, במקום שבר, ידבר עם השרת, המרוחק, הוא ידבר עם האפליקציה שלנו, אנחנו נעתוף את זה בחזרה ב-TCP ונשלח על את זה לשרת. אז בעצם יש לנו את כל האכודות של בר בקלי הזה. אבל מה קרה באמת? הגעתי, שםתי את אדבן ספקט אדיטור, רקו מירה, שלא משנה, ולא ראיתי כלום. אוקיי, למה לא ראיתי כלום? כנראה כי מדובר ב-SSL, שני הקלים האלה לא מתמודדים היום עם SSL, מחקר קצר באינטרנט, חיפושים בגוגל, אמרתי טוב, בתוך יש כלי שיודעה להתמודד עם SSL, הגעתי לאיזשהו קלי נחמד, נקרא STCP pipe, שבעצם, קלי command line, open source, שמאפשר לעשות תעבורה HTP, סליחה לטיפי CP, עם SSL, יש לא אפשרות לשים self-scient certificate, יש לא אפשרויות להחליף Stringing, וכל מיני תוספות נחמדות, הגעתי אותו, ובעצם, הגעתי לאיזשהו שלב ראשוני, שאני רואה תעבורה, כמובן, שבשלב הזה אני רק רואה את התעבורה, אני עדיין לא יכול לעשות את הכלום, לא יכול לשנות אותה, סתם סיידנות, מה אנחנו רואים כאן, Java Serialization, לא יודע אם אתם מכירים, Java Serialization, זה בעצם לקחת איזשהו String, או Obiect, להפוך אותו לדת הסטרים, ולעשות לו DC Realization בצד השני, להחזיר אותו חזרה לתור Obiect, יש על זה הרבה פגיעויות, במידה ועושים את DC Realization, בלי, לבדוק מה, הדתה שלנו, אני לא רוצה להיכנס לזה, כי זה לא בעצם מכשול בדרך, אלא זרק תוספת, אז ריכזתי לכם, שיה לכם נחמד, רגע, סליחה, ריכזתי לכם שיהיה לכם נחמד, את כל הלינקים, שאתם צריכים לדעת על DC Realization, אם אתם רואים, תעבורה כמו שראינו קודם, שרואים שמות של קלאסים, מדובר, ב Java Serialization, הלינקים האלה, הם מרכזים את כל הנושא, מקרה אחרון, שקרה רימות Code Execution, בפייפה, על Barp Extension, סקיינרים לקוד, סקיינרים לאפליקציה, מה שאתם לא רוצים. אוקיי, זו היה סיידנות, אני חוזר, חזרה, היינו, אוקיי, אז בשלב הזה יש לי תעבורה, אבל אני לא יכול לשנות אותה, אני רק רואה מה קורה שם. נדע לראיון גאוני, באותו זמן אני אצל הכוח, כמובן צריך להתקדם, אין לי זמן לחקור, לעשות מחקר של שבוע, ולבוא עם פתרון. אמרתי, בואו ניקח את Advanced Packet Editor, ניקח את STCP pipe, נעביר במקום שה Advanced Packet Editor, במקום שה Packet Editor יעזין, על הקליינט, הוא יעזין ל STCP pipe, ואז אני משוך את התעבורה משם. בקיצור, כלום לא קרה, כמובן, קיבלתי את התעבורה, אחרי שהיא נתפה באססל, אז ראיתי ג'יברי. אוקיי, אבל בטוח יש דרך, שאפשר להתמודד עם STCP, עם STCP, עם TCP, מעל SESL, SESL TLS, אותו דבר, אז יש לנו כלי נחמד, שנקרא TCP Catcher, TCP Catcher, כשמו כנו, מפותח בג'אבא, אנחנו לא ריד אותו מהלינק, מה שאפשר לעשות, בעצם, זה, לא ריד את הקלי הזה, TCP Catcher, לקחת את הסרטיפיקיית שלו, הוא מאפשר, יש לו ליינק בתוך הקלי, אנחנו נראה, אחר כך, אם יש איך זמן דמועים, כמובן, לקחת את הסרטיפיקיית שלו, ולשתול אותו בקיסטו. אוקיי, בואו אני אסביר, קודם כל, מה זה לקחת את הסרטיפיקיית שלו? אז כמו שיצא, בטח, לחלקכם, יש כאן פנטסטרים, לעבוד עם בר, כדי שאנחנו לא נכתוף את כל השגיות, וכדי שהאפליקציה תסכים, לקבל את הסרטיפיקיית שלנו, בדרך כלל, אנחנו צריכים, לגלוש בהתחלה, לכתובת של בר, פלא ריד את הסרטיפיקיית, להתקין אותו, בבראוזר, או בסרטיפיקיית מנאג'מנט בוינדוז, ובעצם, ככה, אנחנו יכולים לעבוד, ולא נקבל, הבראוזרים, לא יזרקו לנו, השגיות. אז אותו דבר כאן, כשבמקום לעבוד, מול הבראוזר, אנחנו עובדים מול קיסטור של ג'ווה. מה זה קיסטור של ג'ווה? אותו דבר, כמו, סרטיפיקיית מנאג'מנט, לג'ווה, יש קיסטור משלוש, מנהל את המפתחות בתוך ג'ווה, יש, ברגע שאנחנו מתקנים, JRE, או JDK, במערכת, זה מגיע עם קיסטור דיפולטי, הקובץ נקרא, C-A-SERTS, שם, כל הסרטיפיקיית, כל C-A, זאת אומרת, רפיד SSL, וכל החברים גוגל, או מי שלא חותם סרטיפיקטים, הכל, מגיע כבר, עם ה-JDK, כדי שאפליקציה שתקבל, איזשהו סרטיפיקיית, תוכל להעלות לרות, ולבדי את הרות מול הסרטיפיקיית. אז איך, מנהלים דבר כזה? כמו שאמרתי, מורידים את הסרטיפיקיית, מתיסי פי קצ'ר, מורידים תוכנה, שנקרא את קיסטור אקספלורר, שם, מאפשרת בעצם, לעשות מנאג'מנט, פותחים את הקיסטור, ומתקינים שם את הסרטיפיקיית. אחר כך, מגדירים לטי סיפי קצ'ר, ויש דמוים יותר מעניינים, אז אני דלג על הדמו עם הפחות מעניינים, מגדירים את טי סיפי קצ'ר, להזין, מצד אחד, לשרת, מצד שני, לקליאנט. ואז מה שקורה, זה שאנחנו מקבלים, תעבורת, טי סיפי, מעל SSL, באפליקציה יכולים, כמובן לראות את כל התעבורה, יש לו יכולות של אינטרספשן, זאת אומרת, אני יכול לתפוס את התעבורה ולשנות אותה. אוקיי, אז עד כאן, הכל הולך חלק. אבל, במציאות לא תמיד הכל עובד חלק, אז מה שקרה, זה שאמרתי, בואו נעשה אותו אותה, הליך בדיוק, שם טי סיפי קצ'ר, וחתף תשגיע. הקליאנט לא מוכן לדבר, אבל למה אתכנתי את הסרטיפיקיית של טי סיפי קצ'ר? בקיסטור, למה הוא לא מוכן לעבוד איתו? הסתכלתי קצת בקוד, שוב, אנחנו רואים פה קוד דמו, כי אני לא יכול להראות דברים המתאים שקרו, אז אני מראה אפליקציה שפיתחנו, שהיא מורה פחות או יותר, לדמות את אותו מקרה. אז אתם יכולים לראות פה, בעצם, קטק קוד, בתוך הג'ר, שבודק את הערכים שהגיעו מהסרטיפיקיית. זאת אומרת, הוא בודק שה... האוקרניזציה, שווהקמיג'יו האינק, והסטייט, או אספייל, וכולי, מה זה בעצם הדבר הזה? זה מה שנקרא, SSL peening, או סרטיפיקיית peening. במקרה הזה ראינו דוגמה לבצם, ערכים של סרטיפיקיית שמתקבלים, ונבדקים על ידי האפליקציה. זה לא תמיד ככה, זה יכול לבוא בהרבה צורות, הרבה מאוד פעמים, האפליקציה ממש, קדמה את הפאבליקי, ממש בתוך הקוד באהפליקציה, כדי שאם יתקבל סרטיפיקיית, לא מוכר, דוגמה TCP קצ'ר, היא לא תסכים לעבוד איתו. ואז גם אם שםנו פרוקסי, בעצם אנחנו לא יכולים לעבוד עם הסרטיפיקיית שהפרוקסים יצר. אוקיי, אבל במקרה שלנו, באפליקציה הזאת, היא מדובר בסלב סיינד סרטיפיקיית. מה זה סלב סיינד סרטיפיקיית? סרטיפיקיית, שהוא לא חתום על ידי רוץ EA אמיתי, אלא נחתם על ידי מי שיצר את הסרטיפיקיית הזה. יש לזה עתרונות, יש לזה חסרונות, לא משנה. מה שחשוב זה שיש לנו את OpenSSL, OpenSSL מאפשר לנו ליצור סרטיפיקתים, גם CA, גם רוציה, גם סרטיפיקתים רגילים, ובעצם, בעצם לענות על הדרישות של האפליקציה על ידי סרטיפיקיית משלנו. אז אם אני רואה את ההרכים האלה, בקוד, איך, אחר כך נראה בעצם איך רואים את ההרכים האלה, אבל בעצם, Java הוא קרי מאוד, קל לעשות לו decode ולראות קוד קרי, אז הסתכלתי קצת על הג'ר, חקרתי מה קורה בפנים, פתחתי כמה קלאסים, וראיתי את ההרכים האלה, ואז בעצם, באמצעות קיטול, יצרתי סרטיפיקיית שעונה על אותן דרישות. אוקיי. יצרתי סרטיפיקית, עכשיו יש לי סרטיפיקיית, שההרכים שלו, הם אותם ערכים שהאפליקציה מבקשת. מעולה, עכשיו ניקח את הקיסטור של הקלאנט, נשתול בפנים את הסרטיפיקית, אז דוני, בוא נגיד, ככה או הפייק שיצרנו, ונוכל להתערב בתעבורה, לעשות מה שאנחנו רוצים, סוף הסיפור של האפליקציה, אבל מה שקרה זה, שכשסמתי את זה, זה לא עבד. למה זה לא עבד? כי TCP קצ'ר, הוא לא יודע לקבל סרטיפיקית מי שלו, זאת אומרת, סרטיפיקית שלנו, שאנחנו יודעים לו, הוא מייצר סרטיפיקית אונדה פליי, היא מזה שהוא ערך, אם אנחנו נחזור שנייה אחורה, היא מזה שהוא ערך, נופס, נכון, שמוגדר פה, וזה הערך שהוא בעצם שוטל בכל השדות של הסרטיפיקית, והוא מייצר אותו ככה. אז TCP קצ'ר, גם כן לא נתן לי מענה במקרה הזה. אוקיי. אז ראינו, סנריואחד של סרטיפיקית פינינג, יש כמה סנריים, זאת אומרת, אפליקת שאת יכולות לעשות כל מיני סוגים של סרטיפיקית פינינג. למשל, לבדוק בעצם שהרוץ צ'יי הוא רוץ צ'יי האמיתי. זאת אומרת, הלכת בכל הצ'יין של צ'יין אופטראסט, ולהגיע לרוץ צ'יי, אבל מה זה בעצם רוץ צ'יי? רוץ צ'יי זה סרטיפיקת, שמגיע, אם זה, בדרך כלל, שאנחנו נובדים עם 브�ראוזר, או משהו כזה, נגיע עם הווינדורס, או עם הלינוק, זה לא משנה מה, ובג'אבה, זה בעצם סרטיפיקת, שמגיע, אם הקיסטור הדיפולטי של הג'אבה, אז בעצם, יש לו סיסמה דיפולטית, שנקראת צ'יינג'מי, אני חושב, עוד צ'יינג ל-12, או משהו כזה, ואפשר, פשוט להכניס לשם, סרטיפיקת אחר, רוץ צ'יי אחר, ואז כשהאפליקציה תבדוק, בעצם תחשוב שהרוץ צ'יי שלנו, רוץ צ'יי אמיתי, מה קורה אבל, עם האפליקציה ממש סמה, את הפאבליקי של הרוץ צ'יי, אז זה אומר, שכנראה, אנחנו נצטרך באמת, לקחת סרטיפיקת, ולחתום אותו באמת, על ידי רוץ צ'יי, לא תהליך כל כך מיגע, אבל אולי טיפה, יציק לנו בדרך. עוד אופציות, זה חתימות, שקצת יותר ידגרו את הבודקולי, זה חתימה של האינטרמידיעט, מה זה אינטרמידיעט? לא כל מוצר רוצה שיהיה לכם את הסרטיפיקת, לכל על הכוחות שלו את הסרטיפיקת, אז הוא מאצר, מה שנקרא, סרטיפיקת נוסף, סרטיפיקת בנאיים שזהו, ולקוח או לכל הקלענט שמשתמש, הוא מגדיר סרטיפיקת חדש, אבל מה, האפליקציה לא בדקת את הסרטיפיקת שהקיבלנו עליי, בדקת את הסרטיפיקת של החברה, שאין לנו אותו. אז מה שנצטרך, כ Otto, לעשות, זה פאטשינג לאפליקציה, עוד מעט נראה איך אנחנו עושים פאטשינג לאפליקציה, צורות נוספות שיכולות להיות, זה שהקליאנט מגיע, כל עושינו, רק תשים, שאפליקציה תגיעה עם קיסטור משלה, מה אנחנו עושים במקרה כזה? מישהו? מחליפים, אוקיי, אם הקיסטור הוא לא מוגע בפסמה, יש כזה דבר, פשוט לוקחים את הקיסטור, מחליפים אותו בקיסטור משלנו, ועובדים רגיל. אם האפליקציה עושה צ'קסם על הקיסטור, או שהיא מגיעה עם סיסמה, יכול להיות שנצטרך לעשות פאטשינג, שוב, פאטשינג לאפליקציה, או לשנות את הצ'קסם, או לשנות את התוצאה של הבדיקה, תלוי מהאפליקציה עושה. בסוף אני אראה לכם כלי שפיתחנו, שבעצם התמודד עם הדבר הזה. אוקיי, בשלב הזה סיימתיום בדיקה, אין לי עדיין כלום, כן? אני כבר רווח, אני לא מתקדם, אמרתי, טוב, בואו נעזוב שנייה את התעבורה, אולי יש דרכים אחרות, להתמודד עם האפליקציה הזאת, בואו נהלך על רנטיימניפולשן, אולי שם אני אצליח לעשות משהו. אז אני מציג לכם את ג'אבא סנופ, לא אנחנו כתבנו אותו, זה כלי חינמי ברשת, אתם יכולים להוריד אותו מהלינג הזה. ג'אבא סנופ בעצם מאפשר לנו לעשות הוק ברנטיימן, לאפליקציה ג'אבא, כל האפליקציה שרצה מעל JVM, אפשר לעשות לה, אפשר לעשות לה הוק, לראות מטודות, פרמטרים, סטק, מה זה לראות, אפשר ממש לעשות הוק על מטודה או על קלאס, וברגע שהקלאס הזה נקרא בעצם לקבל, ולעשות מה שאנחנו רוצים ואיזה מניפולציה שאנחנו רוצים. אז בואו נראה לכם דמו איך זה נראה, לא קרה כלום, אל תדגו. אוקיי, אתם לא רואים, שנייה, שיהיה פתרון, אז ככה. טוב, אז קצת קשה ככה, שנייה, אוקיי, יופי. ג'אבא סנופ, ג'אבא סנופ יכול לעשות אינג'אקשן, או אינג'אקשן, אני אומר אינג'קט הוק, לאפליקציה של פרוסס שכבר רץ, או להרים פרוסס חדש, יכולים לנסות את שניהם, זה לא כזה משנה, אז אני עשיתי לו לפתוח אפליקציה חדשה, אני הולך לג'אבא קליה תססל פינינג, ספרייה שהוא רץ בזה, לא משנה כל כך, אבל במקרה הזה יש כבצים, שהוא צריך, אז אני כן אתן לו. וארגימנטס, במקרה הזה סתם, אפליקציה דמו, ואז אני צריך לתת לו את המין, מין קלאס שלו. אוקיי, אני פותח את זה, יש לי את האופציות של המין קלאס, במקרה הזה זה לוגין וסטארט פרוסס. ואם ראיתם היה רשום שהמתן לו חמש שניות, כדי לבנות אותו, יכולים לנסות מה שאתם רוצים, ועלתה לי אפליקציה. זאת אפליקציה דמו, עקמי ג'אבא, אפליקציה ג'אבא קלאנט סרובר טיפוסית, ואחור אנחנו יכולים לראות את הממשק, את הדשבול, בעצם של הג'אבא סנוב. אוקיי, איך זה עובד? אז קודם כל נדגים, שאני מתחבר סליחה, לשרת, שאין איזשהו שרת על Vm. אוקיי, אז זה הקלאנט שלנו. אני בתור הטקר, אתם תראו פה, יש לי טאב אחד, שהוא לי סייבל, שאני לא יכול להגשת אליו, והוא יוזר שגם כן אין לי שם ההרשאות, כן, ההרשאות קלאנט לא נורא, מה שכן, תסתכלו ביוזר פרופאיל, תראו שיש לי הרכים של אותו יוזר. הטקר, כמובן, סיסמה בקליר טקסט, זה לא ככה זה רק בשביל הדמו, השם והבילנס שלי. אוקיי, איך אני עובד עם ג'אבא סנוב? אז ג'אבא סנוב, יש לו בעצם פה, יש לו כמה פונקציונליות, אחד, הכי חשוב זה, New Hooks, אז בואו נעשה New Hook, בניו הוק יש לי שני אופציות, או לעשות browse, ולקבל רשימה של כל הקלאסים שקיימים באפליקציה, או לעשות חיפוש, אולי, אם יש המון, המון קלאסים, אז אולי יכולים לצמח שיותר מעניין. אז בואו נעשה חיפוש, נגיד, כמובן, דבר ראשון שמכפסים זה אדמין, אוקיי, אין כלום, בואו נהילך לפרופאיל, user, user, אוקיי, עשיתי חיפוש על user, ואני רואה כמה מטודות, מה יש לי פה, get users, get user balance, create new user, get user profile, בואו נהילך על get user profile, אוקיי, שמתי get user profile, hooked, קונדישן, אני יכול להגדיר לו מתי אני רוצה שהעוק הזה ירוץ, במקרה הזה נרוץ תמיד, ואז יש לי כמה דברים, on execution, print parameters, או print stack trace, אפשר להפיס אותו לקובץ, אפשר להפיס אותו לקונסול, במקרה הזה בואו נפיס אותו לקונסול, אוקיי, עכשיו אני ניגש ואתם יכולים לראות שהפרמטר, הטקר, שזה הuser שלי בעצם, הוא פסט לקונסול, יופי, את פסנו לו לקונסול, אבל מה שיותר מעניין זה, בואו נשנה את זה, אז יש לכם פה, למטה, tamper with parameters, או tamper with return value, אנחנו בשלב הזה נעשה tamper with parameters, ושוב פעם נקרא למטוד הזאת, אוקיי, זה כמובן, ברגע שהמטוד הזאת נקראת בjava, ג'אבסנו בעצם תופס את האוונט הזה, ומציג לכם פופ-up של הערך, שהתקבל מהמטוד או שנקרא במטוד, אז אני יכול לראות שזה הטקר, כרגע, בואו נשנה אותו לאדמין, ונראה מה יקרה, אז אני משנה פשוט תארך ברנטה, לאדמין, except changes, ואתם יכולים לראות שפה קיבלתי בעצם ערכים שונים מהשרת, כי התחזיתי לuser אחר. עכשיו שוב פה אני מראה לכם דוגמאות, מאוד טריוויאלית ומאוד קלות, אבל זה בשביל שתבינו את הקונסט. עכשיו אני רוצה השנות ברеспונסור, אותו דבר, אם אני אראה, כשאני נגש לשופ, אני יכול לראות שיש לי פה 0, בבלנס, ראיתי קודם בלנס, אז אני אעשה search לבלנס, get user balance, בואו נוריד את האוק מהשני, והפעם אני רוצה tamper with return values. אוקיי, עכשיו נגלו שוב פעם לשופ, ולא קרק לו, לילד piece, תלכה עשיתי על השני, אוקיי. קפץ להערך, אתם יכולים לראות שיש לי כאן 0, כמובן accept changes והערך שחזר זה ערך החדש שעשיתי, בסוף. אוקיי, זה ג'אבסנו, מאוד פשוט להשתמש באפליקציה כמו ekmidjava, אוקיי, זה חזר, אבל מה קרה באמת? שוב פעם זה מאוד קל על ekmidjava, אבל לא תמיד זה קל במציאות, פתחתי את האפליקציה ו20 קלאסים רק על הלוגין, לא יודע מה, איפה אני מתחיל בכלל, אז התחלתי לחתת ולחתת ולחתת ולחתת ואחרי 5 שעות שאני עובר על כל הקלאסים האפשריים, מצאתי פונקציונלי, מטודה שנקראת ezadmin, כמובן חיקחתי עדיים ezadmin, אני כמובן הולך להתלבש עליו, שרון זה רק יפלן, return value, נחליף false, בטרו, נגמר הסיפור. אוקיי, מה קרה באמת? שוב פעם נחשל. למה זה נחשל? למה האפליקציה, שולחת את המתודה הזאת, היא אומריצה, אתה מול הקלאנט או מול השרת, 3 פעמים בשנייה, זאת אומרת, 3 פעמים, וגם אם אני משנה את הערך מפוס, לטרו, זה מיד נדרס ואז שום דבר שעשיתי, לא תופץ. אוקיי, אז לשנות את זה ידנית, אני לא יכול, אבל היה שם, הראיתי שם, אם אתם יכולים לראות, פה יש run custom רגע, run custom script מעולה, פשוט אני אעשה שזה ירוץ תמיד. אז עשיתי את זה, אבל זה לא עבד למה זה לא עבד? מי יודע, אכיפשתי בגוגל שעתיים בלחפש רק על איך מריצים את הסקריפט הזה, אין כמעט תיעוד על זה, אבל לבנתי שהוא מריץ Java, קוד פשוט, נותנים לו זה, אבל הדוגמאות היחידות שאפשר לראות באינטרנט זה system out println, שגם לא עובדו אז אמרתי, טוב בשלב הזה, שוב אני כבר אחרי, ביום השני לקראת סוף היום בשלי היום ועדיין אין לי שום דבר ממשי שאני יכול לתת או שום דבר בא לרך אמרתי, טוב בוא נעזוב רגע גם את רנטיים, ושוב זה אחרי שעות של התעסקות, כן? בוא נעזוב רגע את הרנטיים, מדובר בג'ר ג'ר, אפשר לעשות, להרוך אותו זאת אומרת זה ג'ר, זה ג'ר זה Zip בעצם Zip, שמכיל בתוכו קלאסים וכבצים, אז אני יכול פשוט לשנות, אמרתי יקח את הג'ר ונעריץ ג'ר XF ובעצם מה שקורה זה שהפקודה הזאת היא פורסת לי את כל הג'ר, היא אני מקבל את כל הקלאסים, כל הקבצים שהיו בפנים לתוך איזושהי תקיעה, ונשנה מהשוק הטען, נערוז מחדש ובואלה יש לי אפליקציה שבעצם מי-אדמין אבל מה? רצתי ג'ר XF לפני זה התפסה 29 מגה הרזתי אותה מחדש, לא עשיתי שום שינוי, הרזתי אותה מחדש 15 מגה 14 מגה, משהו כזה להנלמו 15 מגה ולא יודע טוב, בשלב הזה אני ממש מיואש סוף היום השלישי ממש בתחיית היום השלישי אבל ממש מיואש, אמרתי טוב אין מה לעשות, חוזרים עם מזנב בין הרגליים, אין לי שום דבר מעניין בשלב הזה כבר הייתי מיואש אמרתי, אוקיי בואו לפחות נראה מהאפליקציה מביאה, איזה קווצים יש בהתקנה אולי נמצא קווצים, סיסמאות לדת הבאיס, אני לא יודע מה אולי נמצא משהו מעניין ונביא כמה ממצאים נחמדים מה את זה מתחלתי לשוטט באפליקציה וראיתי ופתאום גיליתי שקלאסים פרוסים בתיקייה של האפליקציה אוקיי, קלאסים פרוסים בתיקייה של האפליקציה זה אומר שאני לא צריך בכלל להרוז ג'ארים, לפתוח ג'ארים זה אומר שאני יכול ישירות לשנות את הקלאסים עצמם זאת אומרת, אני מטרגט קלאס פציפי, אני לא צריך להרוז לעשות שום דבר, בדג'אר, לשנות אותו מה גם שיש אפליקציות שחותמות את הדג'אר ואז אי אפשר לשנות אותו כי הוא חתום אז אמרתי נשנה קלאס מאוד פשוט, בשלב הזה שוב והתמלתי תקווה רגע, איך משנים קלאסים אוקיי, אז אני מציג לכם כלי שנקרא ג'אב הביתקוט אדיטור ג'אב הביתקוט אדיטור גם כלי חינמי כלי חינמי שבעצם מאפשר לכם לפתוח קלאס ולהרוך אותו איך הורכים קלאס קלאס מריץ ג'אב הביתקוט איך אפשר לקרוא את זה מי שמכיר בליסודות אוקיי אז רשימת הפקודות נמצאת בלינק הזה מי שממנים לגלוש כמה פקודות מעניינות שתמיד טוב מי שמכיר עסמב לי אולי חלק מהפקודות יזכירו לו משהו if equal, if not equal בעצם סוג של tru or false iconst 0 או 1 טיטן 1 לתוך int או 0 לתוך int negate, return compare, ldc או ldc underscore w בעצם זה קונסטים לא משהו שצריך לדעת בלפה איך זה עובד ג'אב הביתקוט אוקיי ג'אב הביתקוט מקבל קלאס אז אני צריך אי, אז צריך לפתוח את הקלאס אז אני עושה ג'ר אמרנו מינוס xf לעק מקליים ssl נפתחו כל הקלאסים ועושים מחקר קטן איפה יש משהו מעניין כמה דקות אני טוען את לוגין 2 נקודה קלאס אני מקווה שזה יהיה באמת זה ו... אוקיי זה מה שנפתח, חלון, רשימה של קונסטים לא מעניין אינטרפסים לא מעניין זה לא מעניין, מטוד מטוד זה מעניין יכול לראות מטודות שיש כאן זה לא הקלאס הזה קלאס אחר גם לא וריפאי אוקיי, וריפאי פה אני יכול לראות בעצם את כל הבדיקות שעז ראינו בפרטיפיקי פינינג אני יכול לראות אותם פה בבית קוד טוב, אני לא מוצא את המטוד המעניינת אז אני אראה לכם פשוט סרטון שלא איך עושים את זה את הקלאס המעניין, סליחה לא, אז לא, לא ג'ר אסנוק, סליחה אוקיי, דמו קלאנט ראיתי לכם שבעצם אני לא יכול לפתוח חלק מהטבי אז אני אמריץ JBE, רץ על לוגין שתיים נקודה קלאס ובעצם אני יכול לראות שיש שם איי, אקשנט פרפון, אז פספסתי זה אוקיי, בעצם זה הג'ב הבית קוד של הקלאס הזה אפשר לראות בעצם שיש שם גט מה זה איקוואלס, איקוואלס מכירים ב' אוקיי, אז שני סטרינגים איף איקוואלס טרו איפנות פולס ובעצם רק שנייה, לצורת זה פה אימאיקוואלס קפוץ לפה, איף תיתן אחד, אימנות איקוואלט תקפוץ לפה ובעצם פולס אז יש לי כמה דרכים לשנות את זה אחד לשנות טרו את הערך, מה הבדיקה שהייתה שם אם הערך שמתקבל מהשרת שווה טרו גרשיים טרוס, זאת אומרת, לסטרינג טרו תחזיר אחד, טרו אם הערך שהתקבל שכנראה זה פולס, שונה מטרו אז נון אדמין או whatever תחזיר פולס אז יש לי כמה דרכים לשנות את זה, אחד לשנות את טרו לפולס שתיים במקום איף איקוואלט אפשר לעשות איף נוט איקוואלט שוב, מאוד חשוב בג'ב הביתקוד דברים מינימליים שינוי מינימליים, אנחנו לא רוצים לדפוק את האפליקציה, כמעט כל שינוי שנעשה שהוא לא סטנדרטי הגרום לבעיות באפליקציה והיא לא טרוץ, שאלות אחר כך אז עוד אופציה זה איף נוט איקוואלט והפתרון הכל ביותר איקונסטים, כי זה אינט אז יש לנו רעינו קודם איקונסט 0 ואני יכול לשנות אותו לאיקונסט אינט קונסטיטן אחד ובעצם אני שומר את הקלאס אנחנו עם אותו קלאס עדיין שומר אותו ואז מה שאני צריך לעשות זה לקחת את הג'בא, אם זה פרוס כמובן אני לא צריך אם זה ערוז בג'ר יש לי מה שנקרא ג'ר או uf, אם אני לא טועה הפקודה שבעצם לא צריך לתת לה את כל הקבצים אלא אפשר להחליף לקובץ אחד אז במקרה הזה אתם יכולים לראות שאני מריץ ג'ר מתיקי אחרת uf זה תיטן לתוך אקמיג'ב הקלאנט את הקלאס החדש שלנו לוגין 2 לקודה קלאס ובעצם זהו החליף את הקלאס הקיים ועכשיו שנרים את האפליקציה נתחבר שוב עם הטקר היינו קודם שהטאבים היו לא מורשים ובעצם אתם יכולים לראות קודם כל האד יוזר חזר להיות ולידי או איני בלד פלוס שאני נכנס לביאו יוזר אני יכול לראות את היוזרים כי מבחינת האפליקציה אני אדמין עכשיו שוב מדובר פה על קלאנט סרו תלוי מיוס את ההחלטות אבל נגיע לזה גם בהמשך אני בזמנים, כמה יש לי עוד יש פה משהו אין אף אחד שמשגיח, אין בעיה אוקיי, זה היה כמי ג'אבה מה קרה באמת אז ככה זה הקוד שקיבלתי בפועל באיזושהי אפליקציה אפליקציה יש פה איזשהו ביתקוד זה איזשהו קלאס שרציתי להרוך וזה הקוד האמיתי שקיבלתי באיזשהי אפליקציה ובאיך מבינים מהרשום פה אז שוב פעם אני שנייה עובר איתכם על השורות תיתן משהו, לא מעניין אותי אם נעל תקפוץ ל-14 אם לא תיתן עוד משהו גצטטיק אדמין, מה זה גצטטיק שוב כנראה שאיזשהו סטרינג, שבעצם אומר אדמין ואז תעשה עליו איקואלס אין קייס אינסנסיטיב, זאת אומרת שאם אדמין קטן, זה לא משנה אם כן, תקפוץ ל-18 ב-18 יש לי איקואלס 1 ואם לא הוא פשוט יירד ל-14 שיתן 0 false, והיא קפוץ מעל טרו, כדי להגיע ל-Return with false זה קוד אמיתי של אפליקציה אמיתית ובעצם אם לפני כן, לא היו לי הרשאות לאפליקציה מסוימת ולא יכולתי להגשת בליצור לא משנה מה, בליצור יוזרים אז בעצם, מה שעשיתי זה שיניתי מ-0 ל-1 אותה דוגמה שיריתי לכם בעקמיג'אבה והתפללתי מה שקרה אחרי יומיים וששעות שבעצם עסקתי אדמין על המערכת שוב כנראה לכם, לא טריוויאלי שבעצם מספיק שאני משנה בקליינט וזה עובד אבל גם באפליקציות אמיתיות שנמצאות היום בשוג ומוצרים מוכרים אומרים, רגע, אם יש לי אססל פינינג וזה עובר מעל TLS והאפליקציה שלי מוגנת מאוד בואו נסמוך על הקליינט מה שהקליינט יגיד זה מה שיהיה במיוחד, אם אני כל הזמן שולח לו שדרים אני מעדכן כל הזמן כדי שאם מישהו במקרה איך שהוא עשיג לרגע הרשאות אני מחזיר לו אותם וזה קורה, חברים באמת, אפליקציות שהן Java Client Server המון המון פעמים סומכות על הקליינט כי מניחים זה לא web זה לא web, אי אפשר להתערב, אי אפשר להתעסק ובעצם סומכים על הקליינט אוקיי אז במקרה הזה שעקתי אדמין אבל מה, מה איך עשר לי בכל הסיפור הזה מה היה יכול להוריד ממני את כל התסכול שהיה לי בדרך ולקצר תהליכים בweb שוב פעם אני מזכיר על הבעיות בהרפוטר לנו את כל הבעיות במקרה הזה היה חסר לנו משהו אז חשבנו אני וחבריי באפסי קלאבס חשבנו מה היה חסר וכתבנו איזשהו script script שיושב בין tcp catcher לבין הקליינט קבל את התעודה של tcp catcher ומיד מחליף אותה בתעודה משלנו ומעביר אותך עזרה לקליינט אוקיי קצת מסובך בסוף אמרנו יש לנו script שעובד למה לא לצור ממנו קלי אמיתי אז אני מציג לכם לראשונה לראשונה בעולם אני מציג לכם כלי חדש שפיתחנו דרך אגב זה אחד הדברים הנכמדים והמיוחדים והמיוחדים באפסק שאנחנו לא סתם עושים דיקות אם יש רואים בצורך במה שהוא חדש עושים מחקר עושים פיתוח משקים במחקר ופיתוח ומוציאים קלים עבודה אופן סורס מהלינק הזה דמו אחרון אוקיי הדמו מחולק לשניים אחד בלי פינינג, אחד עם פינינג אני אראה לכם את הדמו לב של הפינינג בעצם אני מגיד תדהי מה שנייה אוקיי סמתי tcp catcher מה קורה באססל פינינג שראינו שיש לנו את הקוד הזה אצטר שאני רץ פשוט הזמן נגמר ראינו שהקוד הזה שיש דיקות בקוד שבודקות שאני מנסה ברגע שאני מנסה להריץ tcp catcher על הפליקצה שיש לאססל פינינג אני בעצם חותף את האקספשן סליחה בחור, אל תביא לי פה סרטיפיקטים מהרחוב ואני עובד עם הסרטיפיקטים שלי אז כתבנו את הקלי הזה שנקרא פרוקסי עם רק שנייה שם מקורי אני יודע אוקיי זה הקלי קלי פרוקסי לכל דבר יש לו match, replays אפשר לראות תעבורה אבל מה מייחד אותו תנו לו סרטיפיקט, או במקרה הזה קיסטור הוא כבר יפתור לכם את הבעיה זאת אומרת שבמקרים של אססל פינינג סרטיפיקט פינינג פשוט עובדים עם הקלי הזה והוא פותר לכם את הבעיה כמובן שאני צריך לטעון את הסרטיפיקט שאני רוצה לעבוד איתו לקיסטור שאני בעצם נותן לו להרחים שהגדרתי מראש הקיסטור שלי מכיל סיסמה 116 וstart אפשר לראות שהוא דולק עכשיו אני ביתה בטרפיק בעצם אני הפתח את אותה את אותה אפליקציה סליחה, רגע את אותה אפליקציה עם ssl פינינג אותו קליינט הפעם במקום לדבר עם השרת רגע רגע עם הפרוקסי שלי סליחה, 127 0.01 תקר אפשר לראות את התעבורה כאן כן, כל תעבורה שאני עבוד איתה היא רצה עם ssl פינינג, אבל מבחינתנו זה שקוף, כי טענו לפרוקסי, לקלי הזה בעצם סרטיפיקת שאנחנו רוצים לעבוד איתו עכשיו מהạ סרטיפיקת שאנחנו רוצים לעבוד איתו שוב זיטלו אי בכליאנט, אם הכליאנט מוכן לקבל רק סרטיפיקת ספציפי אז אני פשוט תה definitулиł לאת הסרטיפיקת או מייצר סרטיפיקה אית כזה קלי לזה כמובן מכיל principle replace, טיפה שונה במקום מהפופאפים שאתי מכירים אני פשוט מגדיר לפו ברונטייד במקום התקר תשים עדמן suddenly I go to Oser Profile ראות פה אדמין, במקום הטקר, באותו דבר כשאני אגלוש לשופ, אם אני בחמש תלף, אה, כן, אדמין, כן, אם אני הטקר, יש לי אפס בבלאנס ואני רוצה לשנות, תחליף אפס, כמובן שאני קבל עכשיו על כל ההפסים שלי את זה, זה כלי עדיין בגרסה, הפיתחנו אותו ממש לאחרונה, אנחנו בגרסה אפס נקודה שש, תפתחו לנו טיקטים בגיטה, מנסה לו שדרוגים, אם יש לכם בקשות, וברגע שאני אגש לשופ, כל ההפסים שלי מתחלפים כמובן בחמשים, אפשר לראות בלוג מה קורה, נתפס או לא נתפס, וכמובן הטרפיק. אוקיי, זה הכל, חשוב לי להדגיש שכל הדברים שכביכו לא עבדו לתוך כדי והצגתי לכם בנפרד, יכול להיות שאלה אפליקציה שאתם תבדקו, כל אחד מהפתרונות האלה יתאים. אנחנו רבים מאוד ג'אבה, כמובן לפרוץ ולא לכתוב, ותורידו את פרוקסי, ומאוד חשוב זה שכל אפליקציה ישבירה, גם אם אנחנו נתקלים באמון, אמון דברים בדרך, גם לידיים מנוסות מאוד, יש לנו פתרונות, פעמים זה דורש קצת זמן של מחקר, אז חיכזתי לכם פה את לינקים של כל הכלים, נראו אנשים מצלמים, המצגות הולות אחר כך לאתר של אורס, אתם יכולים לקחת את הלינקים מכאן, דם הכלים שפיתחנו באפסק, אתם מוזמנים להוריד ולכתוב, לפתוח טיקטים, לשדרוגים שאתם רוצים, וזה הכל, תודה רבה, שאלות, שאלות, היו כמה ידיים, רגע, רגע, רגע, הרבה ידיים, אוקיי, קרוב זה קל, כן, כן, טוב רגע, השנייה, חברים יוצאים, הייתה שאלה אם אני לא יכול להרוך סורס של ג'אבה, אין לי, זאת אומרת, ברגע שאתה מקבל אפליקציה ג'אר, למשל, היא בא עם קלאסים אין לך את הסורס, אתה יכול לראות D-compiled-code שהוא דומה לסורס, אבל אתה לא יכול להרוך, לא, אי אפשר להרוך, אתה לא יכול, אפשר להרוך ג'אבה בית-code, אי אפשר להרוך, אוקיי, אתה לא יכול לקחת את D-compiled-code ולקמפל אותו מחדש לקלאס, זה לא יעבוד, שאלות נוספות, כן, אתה, אתה, אז רגע, במקרה שזה לא היה כל כך מובן, השרת, הוא שרת מרוחק, לא ראיתי אותו, הוא יושב, רגע, לצורך לתגמה LVM, אבל לא משנה זה, שרת שאין לי גישה אליו, מה שתקפתי זה את הקלאנט, הקלאנט, ההק מג'אבה הזה, בפועל היה לי, הייתה לי איזושהי אפליקציות קלאנט, כן, נכון, חלקית, נכון חלקית, אוקיי, אז שאלה טובה, אריתי כאן כמה דברים, Runtime manipulation שדרך אגב ראינו, יכול לעזור לך גם לשנות requestים לשרת, אז אם, כמובן, שאם השרת מובטח, אז השרת מובטח, אז הנזק הוא הנזק קלאנטי, אבל רוב האפליקציות שאנחנו בודקים, אם כל השרתים היו מובטחים, כמובן לא היינו צריכים לעשות פנטסט, אז בפועל השרתים לא מובטחים, זאת אומרת, הרבה פעמים הם מובטחים מפחות ברמה כללית, אבל תיקח כל מוצר שאתה לא רוצה, ככה את המוצר סקיורת הכי מוכר היום בעולם, אני כבר אומר לך, עשינו על הפנטסט והוא פרוץ, נכון, לא, כל פרוץ, לא יהיה לך אוטנטיקציה, באת אוטנטיקציה, באת אוטריזציה, יהיה לך בחלקים מאוד נקודתיים, שאולי הם פתחים שחיכו, בסוף מוצר זה מוצר, ויש לו דדליינים, ומפתחים גם בחברות סקיורתי, מפתחים הם לא כולם מרקע של סקיורתי, מפתחים יצאו מהאוניברסיטה, מה הם למדעו בסקיורתי, ראו איזה, היה להם איזה קורס קצר של סימסטר, תלוי איפה, יכול להיות שלא היה בכלל, והם לא יודעים סקיורתי, עושים להם איזושהי אחשרה בחברה, אבל שוב פעם רוב הפעמים השרת לא מובטח. עכשיו, הרייתי לכם את הכלי שיש בסוף שפיתחנו הפרוקסי, שבעצם מאפשרי לך לשנות תעבורה ולשלוח לשרת. אז שוב, תלוי, אתה יכול לתקוף את הקליאנט, עם הוולידציות הם בקליאנט, ואתה יכול לנסות לתקוף את השרת, או ברנטאים, או בטרפיק, אם השרת לא מובטח. שאלות נוספות, רגע מישהו למעלה? היה קודם ידו? כן. אוקיי, אם הקליאנט מגיע עם קיסטור, עם סיסמך חדשה, אז אמרתי, צגתי, זה בעיה אחת שיכולה להיות, יש לנו שני דרכים. אם יש סיסמה, ואני לא יודע את הסיסמה, אני פשוט מחליף את הקיסטור, זה קובץ. אבל במקרה הזה, אם האפליקציה עושה ולידציה על החתימה של הקיסטור, לראות שהוא לא ישתנה, אז כנראה שאנחנו צריך לעשות קצת פצ'ינג לאפליקציה, לחפש את המקום שבו היא בודקת, האם הווריפי קיסטור, ואולי לחליף שם איזה, תראו לפולס. כן, אז אני צריך גם להחליף את הקיסטור, וגם לשנות הבית קודדיתו. כן, אני יכול, אבל זה קשה, להחליף בית אחד, איי קונסט אחד, מ-01, זה טיפה יותר קשה מלקוף את הפינינג. מה זה תוריד את זה? אוקיי, אז אפשר לעשות פצ'ינג? שוב, קליאנט עם סרטיפיקי את פינינג, אפשר לקוף, אפשר לעשות לו גם בראן טיים, אני יכול לעשות לו בטח יש מטודה שאומרת, איזה פינינג ואלידי, צריך להחליף מפוסט רואו, נכון, הרייתי, אופציה, אפשר. אופציה שנייה זה שבאמת אנחנו רואים שיש ולידציה והקיסטור, נגיד הפאבליקי, הרד קודד באפליקציה, אני יכול להחליף את זה, נכון? אבל זה טיפה יותר מסובך, אפשר, אתה יכול לעשות, זה גם פתרון. זה דרך אגב אחד מהדברים שראייתי שם. כן.