nginx: ดัมพ์คำร้องขอ HTTP สำหรับการดีบัก


17
  • Ubuntu 10.04.2
  • nginx 0.7.65

ฉันเห็นคำขอ HTTP แปลก ๆ บางอย่างมาที่เซิร์ฟเวอร์ nginx ของฉัน

เพื่อให้เข้าใจได้ดียิ่งขึ้นว่าเกิดอะไรขึ้นฉันต้องการถ่ายโอนข้อมูลคำขอ HTTP ทั้งหมดสำหรับการสืบค้นดังกล่าว (เช่นถ่ายโอนข้อมูลขอส่วนหัวและร่างกายที่ใดก็ได้ที่ฉันสามารถอ่านได้

ฉันสามารถทำได้ด้วย nginx อีกวิธีหนึ่ง, มีเซิร์ฟเวอร์ HTTP บางตัวที่อนุญาตให้ฉันทำสิ่งนี้ได้นอกกรอบ, ซึ่งฉันสามารถพร็อกซีคำขอเหล่านี้ด้วยวิธีการของ nginx?

อัปเดต:โปรดทราบว่ากล่องนี้มีการรับส่งข้อมูลจำนวนมากและฉันต้องการหลีกเลี่ยงการจับภาพทั้งหมดในระดับต่ำ (พูดด้วยtcpdump) และกรองออกภายหลัง

ฉันคิดว่ามันจะง่ายกว่ามากในการกรองทราฟฟิกที่ดีก่อนในกฎการเขียนใหม่ (โชคดีที่ฉันสามารถเขียนได้ง่าย ๆ ในกรณีนี้) แล้วจัดการกับทราฟฟิกที่หลอกลวงเท่านั้น

tcpdumpและฉันไม่ต้องการที่จะหาช่องจราจรปลอมกล่องอื่นเพียงเพื่อให้สามารถที่จะจับมันที่นั่นด้วย

อัปเดต 2:เพื่อให้รายละเอียดเพิ่มเติมเล็กน้อยคำขอปลอมมีพารามิเตอร์ชื่อ (พูด) fooในแบบสอบถาม GET (ค่าพารามิเตอร์อาจแตกต่างกัน) รับประกันการร้องขอที่ดีไม่ให้มีพารามิเตอร์นี้

ถ้าฉันสามารถกรองโดยสิ่งนี้ในtcpdumpหรือngrepอย่างใด - ไม่มีปัญหาฉันจะใช้เหล่านี้


คุณสามารถจำแนก / จำแนกคำขอที่คุณพิจารณาว่า "แปลก" ได้หรือไม่? เราจะมีกฎเพื่อช่วยคุณได้อย่างไรถ้าคุณไม่แบ่งปันกับเราว่า 'ปกติ' และ 'ปลอม' เป็นอย่างไร
hobodave

ฉันไม่ขอกฎ - ฉันสามารถเขียนได้อย่างง่ายดายด้วยตัวเอง ฉันขอวิธีการถ่ายโอนข้อมูลการร้องขอ HTTP
Alexander Gladysh

@hododave: แต่เมื่อคุณถามฉันได้เพิ่มข้อมูลนี้ในคำถาม
Alexander Gladysh

คำตอบ:


30

ปรับจำนวนบรรทัดก่อน / โพสต์ (-B และ -A args) ตามต้องการ:

tcpdump -n -S -s 0 -A 'tcp dst port 80' | grep -B3 -A10 "GET /url"

สิ่งนี้ช่วยให้คุณได้รับคำขอ HTTP ที่คุณต้องการโดยไม่ต้องสร้างไฟล์ PCAP ขนาดใหญ่ที่คุณต้องถ่ายที่อื่น

โปรดจำไว้ว่าตัวกรอง BPF ไม่แน่นอนถ้ามีแพ็คเก็ตจำนวนมากไหลผ่านกล่องใด ๆ BPF สามารถและจะวางแพ็กเก็ตได้


5

ฉันไม่ทราบว่าสิ่งที่คุณหมายถึงกับการถ่ายโอนการร้องขอ แต่คุณสามารถใช้ tcpdump และ / หรือwiresharkเพื่อวิเคราะห์ข้อมูล:

# tcpdump port 80 -s 0 -w capture.cap

และคุณสามารถใช้ wireshark เพื่อเปิดไฟล์และดูการสนทนาระหว่างเซิร์ฟเวอร์


ขอบคุณ แต่ฉันมีทราฟฟิกค่อนข้างน้อยบนเซิร์ฟเวอร์นี้ (99% ของมันดี) และฉันคิดว่ามันยากที่จะกรองกลุ่มข้อมูลนั้นสำหรับปลอม 1% ที่ฉันต้องการ
Alexander Gladysh

... ถ้าฉันจับภาพทั้งหมดในระดับต่ำเช่นนี้ :-)
Alexander Gladysh

ฉันได้อัปเดตคำถามเพื่อสะท้อนว่า
Alexander Gladysh

อเล็กซานเดอร์ - นั่นหมายถึงว่า 1 ในทุก ๆ 100 คำขอจะมีส่วนหัวแปลก ๆ ที่คุณกำลังมองหา เรียกใช้การจับภาพสักครู่แล้วค้นหาบันทึกที่เกิดขึ้นเพื่อค้นหาส่วนหัวที่คุณต้องการ - นั่นไม่ใช่งานที่ไม่สามารถทนได้
EEAA

ปัญหาไม่ใช่งาน แต่เป็นปริมาณข้อมูลที่ต้องดำเนินการ (มันอาจจะทนได้ แต่ แต่แล้วผมต้องการที่จะเห็นการแก้ปัญหาที่เป็นมิตรมากขึ้น.)
อเล็กซานเด Gladysh

0

หากคุณพร็อกซีคำขอไปยัง Apache ด้วยการติดตั้ง mod_php คุณสามารถใช้สคริปต์ PHP ต่อไปนี้เพื่อดัมพ์คำร้องขอ:

<?php
$pid = getmypid();
$now = date('M d H:i:s');
$fp = fopen('/tmp/intrusion.log', 'a');

if (!function_exists('getallheaders')) 
{ 
    function getallheaders() 
    { 
           $headers = ''; 
       foreach ($_SERVER as $name => $value) 
       { 
           if (substr($name, 0, 5) == 'HTTP_') 
           { 
               $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; 
           } 
       } 
       return $headers; 
    } 
} 

function ulog ($str) {
    global $pid, $now, $fp;
    fwrite($fp, "$now $pid {$_SERVER['REMOTE_ADDR']} $str\n");
}

foreach (getallheaders() as $h => $v) {
    ulog("H $h: $v");
}
foreach ($_GET as $h => $v) {
    ulog("G $h: $v");
}
foreach ($_POST as $h => $v) {
    ulog("P $h: $v");
}
fclose($fp);

โปรดทราบว่าเนื่องจากคุณใช้ nginx $_SERVER['REMOTE_ADDR']อาจไม่มีจุดหมาย คุณจะต้องส่ง IP จริงไปยัง Apache ผ่าน proxy_set_header X-Real-IP $remote_addr;และคุณสามารถใช้สิ่งนั้นแทน (หรือเพียงแค่เชื่อว่ามันถูกบันทึกไว้ผ่านgetallheaders())


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