ฉันจะปฏิเสธอีเมลสแปมที่เข้ารหัส base64 ได้อย่างไร


11

ฉันเพิ่งได้รับอีเมลสองฉบับที่มีเนื้อหาคล้ายกันซึ่งเข้ารหัสด้วย base64 ตอนนี้ฉันต้องการที่จะปฏิเสธหรือทิ้งอีเมลประเภทนี้โดยใช้การตรวจร่างกาย

ก่อนที่ฉันจะมีร่างกายของฉันตรวจสอบบางอย่างเช่นนี้:

/Quanzhoucooway/ DISCARD

แต่เนื่องจากข้อความถูกเข้ารหัสว่าคำหลักจะไม่ถูกตรวจพบ

นี่คือข้อความที่เข้ารหัส base64:

DQpIaSBGcmllbmRzLA0KDQpHb29kIGRheSENCg0KVGhpcyBpcyBWaWN0b3JpYSBmcm9tIFF1YW56
aG91Y29vd2F5IHNob2VzIHRyYWRpbmcgY28uLGx0ZCwgYSBwcm9mZXNzaW9uYWxtYW51ZmFjdHVy
ZXIgYW5kIGV4cG9ydGVyIG9mIGFsbCBraW5kcyBvZiBzaG9lcywgbWFpbmx5IGluIGNhc3VhbCBz
aG9lcyBhbmQgc3BvcnRzIHNob2VzICwgd2hpY2ggaGFzIGJlZW4gc3VwcGxpZWQgdG8gdGhlIGZh
bW91cyBmYXNoaW9uIGJyYW5kIHN0b3JlcyBmcm9tIDIwMTAuDQoNCk5vdGljaW5ndGhhdCB5b3Ug
YXJlIGxvb2tpbmcgZm9yIGhpZ2ggcXVhbGl0eSBmYXNoaW9uIHNob2VzLCBzbyBJIGhvcGUgd2Ug
Y2FuIHdvcmsgdG9nZXRoZXIgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IGFyZSBpbnRlcmVzdGVkLCBJ
IHdpbGwgc2VuZCB5b3Ugb3VyIGl0ZW1zIGFjY29yZGluZ2x5Lg0KDQpGWUksIHdlIGNhbiBtYWtl
IGN1c3RvbWl6ZWQgc2FtcGxlcyBmb3IgeW91IGFjY29yZGluZ2x5Lg0KDQpMb29raW5nIGZvciB5
b3VyIHNvb25lc3QgcmVzcG9uc2UuDQoNCkJSIQ0KDQpWaWN0b3JpYSANCg==

ดังนั้นวิธีที่ดีที่สุดในการบล็อกอีเมลประเภทนี้คืออะไร?


3
การกรองสแปมที่เหมาะสมที่ทำงานกับเนื้อหาที่ถอดรหัสจริงของข้อความหรือไม่
ceejayoz

คุณจะเจาะจงมากขึ้นควรใช้กลไกแบบไหน? ฉันใช้ spamassassin อยู่แล้วและมันก็ใช้งานได้ดีในการต่อสู้กับสแปม
user134969

ฉันจะ MTA- ปฏิเสธพวกเขาพร้อมกับข้อความแสดงข้อผิดพลาดของ "Don't base64 encode Messages เนื้อความ"
joshudson

คำตอบ:


19

อย่าทำสิ่งนี้กับ Postfix body_checkแต่เขียนกฎ Spamassassinแทน Spamassain ถอดรหัสเนื้อหาของข้อความก่อนที่จะใช้กฎของมัน สิ่งที่ต้องการ:

body     LOCAL_QUANZHOUCOOWAY  /Quanzhoucooway/
score    LOCAL_QUANZHOUCOOWAY  7.0
describe LOCAL_QUANZHOUCOOWAY  Block word Quanzhoucooway

กฎเหล่านี้เป็นของ/etc/mail/spamassassin/local.cf(หรือ~/.spamassassin/user_prefs)


1
จะสามารถใช้งานได้หรือไม่แม้ว่าคำหลักนั้นจะถูกเข้ารหัสด้วย base64 เช่นเนื้อหานั้น
user134969

2
ใช่. มีคนแก้ไขคำตอบของฉันแล้วเพื่อชี้แจง ขอบคุณคนที่ไม่ระบุชื่อ! :)
Esa Jokinen

9

ในทางเทคนิคคุณสามารถกรองข้อมูล base64 ที่เข้ารหัสสำหรับคำหลักได้โดยตรง ฉันไม่ได้บอกว่ามันเป็นเรื่องจริงหรือมีเหตุผลที่ต้องทำเนื่องจากมีทางเลือกที่ดีกว่าและง่ายกว่า (ดังที่อธิบายไว้ในคำตอบของ Esa ด้านบน) แต่ก็เป็นไปได้

เคล็ดลับคือการตระหนักว่าการเข้ารหัส base64เป็นการแม็พที่กำหนดไว้ล่วงหน้าของบล็อกขนาด 3 ไบต์ของข้อมูลดิบที่ไม่มีการเข้ารหัสเป็นบล็อก 4 ตัวอักษรของอักขระฐาน 64 ดังนั้นเมื่อใดก็ตามที่มีลำดับของบล็อกขนาด 3 ไบต์ปรากฏขึ้นในข้อมูลที่ไม่มีการเข้ารหัสลำดับของบล็อกขนาด 4 ตัวที่เหมือนกันจะปรากฏขึ้นในรุ่นที่เข้ารหัส

ตัวอย่างเช่นถ้าคุณป้อนสตริงQuanzhoucoowayเป็นเข้ารหัส base64UXVhbnpob3Vjb293YXk=คุณจะได้รับการส่งออก เนื่องจากความยาวของอินพุตไม่ใช่หลายไบต์ 3 เอาต์พุตมีpaddingที่ท้าย แต่ถ้าเราวาง=สัญญาณสุดท้ายและอักขระ base64 ตัวสุดท้ายk(เพราะเข้ารหัสบิต padding บางส่วน) เราจะได้รับสตริงUXVhbnpob3Vjb293YXที่รับประกันว่าจะปรากฏในข้อมูลที่เข้ารหัส base64 เมื่อใดก็ตามที่แฝดไบต์Qua, nzh, ouc, oowและแฝดบางส่วนayปรากฏในการป้อนข้อมูลในลำดับที่

แต่แน่นอนสตริงQuanzhoucoowayอาจไม่เริ่มตรงกับขอบเขตของ triplet ตัวอย่างเช่นถ้าเราเข้ารหัสสตริงXQuanzhoucoowayแทนเราจะได้ผลลัพธ์WFF1YW56aG91Y29vd2F5ซึ่งมีลักษณะแตกต่างไปจากเดิมอย่างสิ้นเชิง เวลานี้ความยาวของการป้อนข้อมูลหารด้วยสามได้ดังนั้นจึงไม่มีตัวอักขระซ้อนภายในท้ายที่สุด แต่เราต้องทิ้งอักขระสองตัวแรก ( WF) ซึ่งแต่ละตัวเข้ารหัสบิตบางส่วนจากXไบต์ที่ผ่านการเตรียมไว้ให้เราด้วยF1YW56aG91Y29vd2F5.

ในที่สุดการเข้ารหัส base64 XXQuanzhoucoowayให้เอาต์พุตWFhRdWFuemhvdWNvb3dheQ==ซึ่งมีช่องว่างภายในทั้งสองด้าน การถอดอักขระสามตัวแรกWFh(ซึ่งเข้ารหัสXXคำนำหน้า) และตัวละครทั้งสามที่ผ่านมาQ==(ซึ่งเข้ารหัสช่องว่างภายในศูนย์บิตที่สิ้นสุด) RdWFuemhvdWNvb3dheเราซ้ายกับสตริง ดังนั้นเราจึงได้รับสามสตริงการเข้ารหัส 64 เบสต่อไปนี้:

UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe

ซึ่ง (อย่างน้อย) หนึ่งต้องปรากฏใน base64 เข้ารหัสรูปแบบของสตริงป้อนข้อมูลใด ๆ Quanzhoucoowayที่มีคำว่า

แน่นอนถ้าคุณโชคไม่ดีตัวเข้ารหัส base64 อาจแทรกตัวแบ่งบรรทัดที่อยู่ตรงกลางระหว่างสองสามส่วนที่เข้ารหัส (ตัวอย่างเช่นข้อความของคุณมีหนึ่งระหว่างF1YW56และaG91Y29vd2F5.) ดังนั้นในการจับคู่สตริงเหล่านี้กับ regexps ได้อย่างน่าเชื่อถือคุณต้องมีสิ่งต่อไปนี้ (ใช้ไวยากรณ์ PCRE):

/UXVh\s*bnpo\s*b3Vj\s*b293\s*YX/ DISCARD
/F1\s*YW56\s*aG91\s*Y29v\s*d2F5/ DISCARD
/R\s*dWFu\s*emhv\s*dWNv\s*b3dh\s*e/ DISCARD

การสร้างรูปแบบเหล่านี้ด้วยมือเป็นเรื่องที่น่าเบื่อ แต่ก็ไม่ยากที่จะเขียนสคริปต์ง่าย ๆ ที่จะทำในภาษาโปรแกรมที่คุณโปรดปรานอย่างน้อยก็ตราบใดที่มีตัวเข้ารหัส base64

หากคุณต้องการจริงๆคุณสามารถใช้การจับคู่แบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่โดยการเข้ารหัส base64 ทั้งตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ของคำหลักและรวมเข้ากับ regexp ที่ตรงกับการรวมกันของพวกเขา ตัวอย่างเช่นการเข้ารหัส base64 quanzhoucoowayคือcXVhbnpob3Vjb293YXk=ขณะที่ของQUANZHOUCOOWAYคือUVVBTlpIT1VDT09XQVk=ดังนั้นกฎ:

/[cU][XV]V[hB]\s*[bT][nl]p[oI]\s*[bT][31]V[jD]\s*[bT][20]9[3X]\s*[YQ][XV]/ DISCARD

จะตรงกับคำที่เข้ารหัส base64 "Quanzhoucooway" ไม่ว่าในกรณีใด ๆ โดยมีเงื่อนไขว่าจะเริ่มในขอบเขตของแฝด การสร้าง regexps ที่สอดคล้องกันอีกสองรายการสำหรับเวอร์ชันที่ถูกเลื่อนนั้นจะถูกทิ้งไว้เป็นแบบฝึกหัด ;)

อนิจจาการทำอะไรที่ซับซ้อนกว่าการจับคู่สตริงย่อยแบบนี้อย่างรวดเร็วกลายเป็นทำไม่ได้ แต่อย่างน้อยมันก็เป็นกลลวงที่เรียบร้อย โดยหลักการแล้วมันอาจมีประโยชน์ถ้าคุณด้วยเหตุผลบางอย่างไม่สามารถใช้ SpamAssassin หรือตัวกรองอื่น ๆ ที่สามารถถอดรหัสการเข้ารหัส base64 ก่อนการกรอง แต่ถ้าคุณสามารถทำได้แทนที่จะใช้แฮ็กแบบนี้คุณควรทำอย่างแน่นอน


1
ใช่มันเป็นไปได้ที่ ; ไม่จริงและไม่ใช่สิ่งที่คุณต้องการทำอีกครั้งสำหรับทุกคำ +1 สำหรับคำอธิบาย: แม้ว่าสิ่งนี้อาจไม่ได้มีประโยชน์มาก แต่ก็กำลังให้ความรู้อย่างแน่นอน!
Esa Jokinen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.