เป็นไปได้ไหมที่ผู้ดูแลระบบจะดักฟังบนเทอร์มินัลผู้ใช้ของตน?


17

เมื่อเข้าสู่ระบบในเครื่องผมสามารถหาอุปกรณ์หลอกขั้วของผู้ใช้แต่ละ (s) wจากการส่งออกของ การดูแลระบบเป็นไปได้หรือไม่ที่ฉันจะแอบฟังบนเทอร์มินัลนี้โดยที่ผู้ใช้ไม่ทราบ? กล่าวอีกนัยหนึ่งฉันต้องการเห็นทุกสิ่งที่ทำบนเทอร์มินัลนี้เป็นเอาต์พุตในเทอร์มินัลของฉันเอง

โปรดทราบสิ่งต่อไปนี้:

  • นี่ไม่ใช่กรณีการใช้งานจริงในการตรวจสอบกิจกรรมของผู้ใช้: ฉันทราบว่ามีเครื่องมือตรวจสอบระบบสำหรับสิ่งนั้น ฉันแค่อยากรู้ว่ามันสามารถทำได้
  • ฉันตระหนักถึงคำถามนี้และดูเหมือนจะไม่ครอบคลุมสิ่งที่ฉันถามเกี่ยวกับวิธีแก้ปัญหาทั้งหมดที่แนะนำว่ามีการบุกรุก (ผู้ใช้จะตระหนักถึงสิ่งที่ฉันทำ) หรือสร้างเสียงรบกวนมากเกินไป ( straceวิธีการแก้). gdbวิธีการแก้ปัญหาหนึ่งที่มาใกล้เป็นสิ่งหนึ่งที่แสดงให้เห็นการใช้ แต่นี่ให้ฉันเห็น stdout ของเทอร์มินัลอื่นเท่านั้น

สิ่งที่ฉันได้ลอง

ฉันลองสิ่งนี้จากเครื่องของฉัน:

tee /dev/pts/user_pts </dev/pts/user_pts

สิ่งนี้ทำให้ฉันเห็นอักขระแต่ละตัวที่ผู้ใช้พิมพ์ในเทอร์มินัลหลอกอื่น ๆ ขณะที่พิมพ์ ปัญหาคือตัวละครทุกสองสามตัวมันจะ "ข้าม": มันจะแสดงหนึ่งตัวอักษรโกงในอุปกรณ์ปลายทางหนึ่ง แต่ไม่อื่น นอกจากนี้ยังป้องกันการประมวลผลคำสั่งใด ๆ จากอุปกรณ์ปลายทางหลอกของผู้ใช้ ฉันไม่แน่ใจจริงๆว่าทำไมสิ่งนี้จึงเกิดขึ้นและมีวิธีการปรับปรุงหรือไม่

สิ่งที่ฉันอยากเห็น

USER TERMINAL        |    MY TERMINAL
$ echo "Test"        |    # slick_command_here
Test                 |    echo "Test"
$                    |    Test

1
คุณต้องการหรืออาจจะttysnoop peekfd
n คำสรรพนาม 'm

คำตอบ:


11

นี่คือ fd ไปยังด้านต้นแบบของเทอร์มินัลหลอกในเทอร์มินัลอีมูเลเตอร์ที่คุณต้องการตรวจสอบหากคุณต้องการดูว่ามีอะไรปรากฏอยู่ fd หลักนั่นคือสิ่งที่จำลองลวดที่ไปยังเทอร์มินัลจริง สิ่งที่xtermเขียนไว้คือตัวละครที่สร้างขึ้นจากปุ่มที่คุณกด สิ่งที่อ่านจากมันคือสิ่งที่มันแสดง

ตัวอย่างเช่นบน Linux:

$ lsof -ac xterm /dev/ptmx
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
xterm   15173 chazelas    4u   CHR    5,2      0t0 2131 /dev/ptmx

จากนั้นเรียกใช้ตัวอย่างเช่น:

stty -echo -opost
strace -e read -e read=4 -p15173 2>&1 | stdbuf -o0 sh -c '
  grep "^ |" | cut -b11-60 | tr -d " " | xxd -r -p'

แน่นอนว่ามันจะทำงานได้ดีกว่าหากคุณใช้งานในเทอร์มินัลที่มีขนาดและประเภทเดียวกันกับที่คุณกำลังพยายามตรวจสอบ คุณสามารถรับขนาดด้วย:

stty size < /dev/pts/that-terminal

นั่นจะทิ้งสิ่งที่อ่านโดยxtermด้านหลักของเทอร์มินัลดังนั้นสิ่งที่ปรากฏที่นั่นรวมถึงโลคัลechoของสิ่งที่กำลังพิมพ์

-e read=4ข้างต้นสำหรับstraceการส่งออก hexdump ของสิ่งที่xtermอ่านบน FD 4. ส่วนที่เหลือของคำสั่งคือการแปลงที่ตัวละครที่เกิดขึ้นจริง ฉันลองpeekfd -n -8 15173 4แต่ด้วยเหตุผลบางอย่างที่ให้สิ่งที่เขียนเท่านั้น

เรากำลังใช้-opostเพื่อปิดใช้งานการโพสต์ใด ๆ ในเทอร์มินัลการตรวจสอบของเราเพื่อให้ทุกสิ่งที่xxdเขียนไปยังด้านทาสทำให้มันไม่เปลี่ยนแปลงไปด้านมาสเตอร์ของเราเพื่อให้การตรวจสอบของเราxtermได้รับเช่นเดียวกับการตรวจสอบ -echoคือเพื่อที่ว่าถ้าการประยุกต์ใช้ในการตรวจสอบสถานีส่งลำดับหนีที่ร้องขอคำตอบจากสถานี (เช่นผู้ที่ขอเคอร์เซอร์ตำแหน่งหรือประเภทอาคารหรือชื่อหน้าต่าง) ที่จะทำให้ทางที่จะตรวจสอบของเราxtermและเราxtermประสงค์ ตอบกลับเช่นกัน เราไม่ต้องการเสียงสะท้อนของท้องถิ่น

คุณสามารถตรวจสอบสิ่งที่ถูกพิมพ์โดยติดตามการwriteเรียกระบบไปยัง fd เดียวกันนั้น (แทนที่readด้วยwriteด้านบน) โปรดทราบว่าเมื่อทำการกดEnterเทอร์มินัลอีมูเลเตอร์จะส่งอักขระ CR ไม่ใช่ LF นอกจากนี้เนื่องจากเรากำลังติดตามด้านมาสเตอร์หากผู้ใช้พิมพ์a<Backspace>bเราจะเห็นการกดแป้นทั้ง 3 ครั้งแม้ว่าอุปกรณ์เทอร์มินัลจะอยู่ในโหมดมาตรฐาน

ทำไมคุณไม่ทำงาน:

tee /dev/pts/user_pts </dev/pts/user_pts

การอ่านจากอุปกรณ์ปลายทางเป็นการอ่านอินพุตของผู้ใช้และการเขียนลงไปเพื่อแสดงให้ผู้ใช้เห็น

คุณกำลังบอกteeให้อ่านจากอุปกรณ์ปลายทาง ดังนั้นสิ่งที่มันอ่าน (อินพุตของผู้ใช้) จะไม่ได้เกิดreadจากแอปพลิเคชันที่รันในเทอร์มินัล (และในทางกลับกันteeและนั่นapplicationจะต่อสู้เพื่ออินพุตเทอร์มินัล) การเขียนไปยังอุปกรณ์เทอร์มินัลนั้นมีไว้สำหรับแสดงที่นั่นไม่ใช่เพื่อนำกลับไปใช้เป็นอินพุต เมื่อคุณทำ

echo test

(กับecho's stdout เป็นขั้ว) testมันไม่ได้เป็นสิ่งเดียวกับกรณีที่คุณพิมพ์

มีioctl( TIOCSTI) เพื่อใส่อักขระกลับเป็นอินพุต แต่แม้จะไม่ได้ผลจริง ๆ เพราะคุณสามารถนำกลับมาใช้หลังจากแอปพลิเคชันอ่านแล้วบางส่วนดังนั้นมันจะเปลี่ยนลำดับที่แอปพลิเคชันอ่านอินพุตและอื่น ๆ นั่นหมายความว่าคุณจะอ่านซ้ำแล้วซ้ำอีก


1
+1 สำหรับคำอธิบายและไม่ใช้เครื่องมือภายนอก ฉันจะต้องอ่านเพื่อทำความเข้าใจคำตอบของคุณหลาย ๆ ส่วน แต่ฉันรู้สึกว่ามันสอดคล้องกับสิ่งที่ฉันต้องการ
โจเซฟอาร์.

5

หากระบบปฏิบัติการของคุณรองรับ dtrace นั่นเป็นสคริปต์ง่ายๆshellsnoopควรอนุญาตให้คุณตรวจสอบทุกอย่างที่พิมพ์ / พิมพ์บน tty ที่กำหนด

หากคุณใช้งาน Linux ttysnoopเคยทำสิ่งที่คล้ายกัน แต่จำเป็นต้องมีการกำหนดค่าแบบล่วงล้ำเป็นสิ่งที่ต้องมีก่อนและ AFAIK ไม่รองรับเคอร์เนลปัจจุบันอีกต่อไปดังนั้นจะไม่ช่วยในกรณีของคุณ มีความพยายามขั้นสูงมากขึ้นหรือน้อยลงในการจัดหาการติดตามแบบไดนามิกด้วย Linux, systemtap, ktap และแม้กระทั่ง dtrace ดังนั้นคุณอาจตรวจสอบได้

แก้ไข:ระวังpeekfdสถานะหน้าคู่มือของมัน:

Bugs:

อาจเป็นไปได้มาก อย่าแปลกใจถ้ากระบวนการที่คุณเฝ้าติดตามนั้นตาย


3

วิธีการนี้เกี่ยวข้องกับ gdb และ tee เล็กน้อย อ่าและมันยังใช้ socat เพื่อเลียนแบบเทอร์มินัลเทียม มันสามารถทำงานได้โดยปราศจากมัน แต่ผู้ใช้จะสังเกตเห็นว่าผลลัพธ์ของเขา / เธอไม่ใช่เทอร์มินัล (โปรแกรมเช่น vi จะบ่น)

มันทำต่อไปนี้:

  1. สร้างตัวดักจับโดยใช้ socat ซึ่งแสดงตัวเป็น pty
  2. Interceptor เชื่อมต่อกับ tee ซึ่งทำซ้ำสตรีมในทั้ง $ sys terminal และ terminal $ usr
  3. Gdb ใช้เพื่อแทนที่ตัวอธิบายไฟล์ stdout / stderr ให้ชี้ไปที่ตัวรับสัญญาณแทนเทอร์มินัล $ usr

ฉันสังเกตเห็นว่าทุบตีดูเหมือนจะเขียนสิ่งที่คุณพิมพ์ไปยัง stderr ฉันไม่แน่ใจว่าโปรแกรมอื่นทำเช่นเดียวกัน ถ้าเป็นเช่นนั้น stdin ไม่จำเป็นต้องถูกดัก

chmod +x /path/to/script; sudo /path/to/script <usr> <sys-adm>เรียกมันเช่นนี้ usrและsys-admเป็นชื่อของเทอร์มินัลเช่น/dev/pts/1. sudo /path/to/script /dev/pts/1 /dev/pts/2ดังนั้นการเรียกตัวอย่างจะมีลักษณะเช่นนี้ คุณสามารถค้นหาเทอร์มินัลด้วยttyคำสั่ง และผู้ใช้ปลายทางทั้งที่มีหรือwps

#!/bin/sh

[ "$1" ] || exit 1
[ "$2" ] || exit 1

usr=$1
sys=$2
utty=${1#/dev/}

ps -e -o tty= -o pid= -o user= | { 
    found_it=

    while read -r tty pid_sh owner; do
        if [ "$utty" = "$tty" ]; then
            found_it=y
            break;
        fi
    done

    [ "$found_it" ] || exit 1

    tmp=$(mktemp)
    tmp_gdb=$(mktemp)

    trap 'rm "$tmp" "$tmp_gdb"' EXIT

    socat PTY,link="$tmp",echo=0,raw,openpty,user="$owner",mode=0600 SYSTEM:"tee $sys > $usr"      &

    printf 'call dup2(open("%s", 1), 1)\ncall dup2(open("%s", 1), 2)
            detach\nquit\n' "$tmp" "$tmp" > "$tmp_gdb"
    gdb -p "$pid_sh" -x "$tmp_gdb" >/dev/null 2>&1 &

    wait
}

2

มีโปรแกรม C อย่างง่ายที่เรียกว่า xkey.c เพื่อแสดงการหาประโยชน์ของ X11 ฉันจะให้คุณ google คุณสามารถดักจับการกดแป้นบน xterm โดยใช้สิ่งนี้โดยที่ผู้ใช้ไม่ได้รับรู้


ฉันหวังว่าจะเป็นทางออกของเทอร์มินัลอีมูเลเตอร์ - ผู้ไม่เชื่อเรื่องพระเจ้า
โจเซฟอาร์

xkey จะให้การกดแป้นบนหน้าจอ X นั่นจะเป็น xterms ทั้งหมดและยูทิลิตี้อื่น ๆ ที่จำเป็นต้องใส่คีย์บอร์ด
คลายน็อต

ขวา. ฉันคิดว่าคุณหมายถึงxtermเฉพาะ
โจเซฟอาร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.