OpenBSD төслөөс боловсруулсан шуудангийн серверт
Довтолгооны хоёр хувилбарыг санал болгож байна. Эхний сонголт нь OpenSMTPD-ийн өгөгдмөл тохиргоонд ажилладаг (зөвхөн localhost-ын хүсэлтийг хүлээн авдаг) бөгөөд халдагч сервер дээрх дотоод сүлжээний интерфэйс (жишээ нь, хостинг систем дээр) хандах боломжтой үед асуудлыг дотооддоо ашиглах боломжийг олгодог. . Хоёрдахь сонголт нь OpenSMTPD-г гадаад сүлжээний хүсэлтийг (гуравдагч этгээдийн имэйлийг хүлээн авдаг шуудангийн сервер) хүлээн авахаар тохируулсан үед тохиолддог. Судлаачид OpenBSD 6.6-д багтсан OpenSMTPD хувилбар болон бусад үйлдлийн системд зориулсан зөөврийн хувилбартай (Debian-ийн туршилтаар явуулсан) хоёуланд нь амжилттай ажилладаг мөлжлөгийн прототипийг бэлтгэсэн байна.
Асуудал нь илгээгч/хүлээн авагчийг тодорхойлсон "MAIL FROM" ба "RCPT TO" талбар дахь утгуудын зөв эсэхийг шалгахын тулд дуудагдсан smtp_mailaddr() функцийн алдаанаас үүдэлтэй бөгөөд холболтын явцад дамжуулагдсан. шуудангийн сервертэй. Имэйл хаягийн "@" тэмдгийн өмнө байгаа хэсгийг шалгахын тулд smtp_mailaddr() функцийг дуудна.
valid_localpart() нь RFC 5322-ын шаардлагын дагуу "!#$%&'*/?^`{|}~+-=_" тэмдэгтүүдийг (MAILADDR_ALLOWED) хүлээн авдаг.
Энэ тохиолдолд мөрнөөс шууд зугтахыг mda_expand_token() функцэд гүйцэтгэдэг бөгөөд энэ нь зөвхөн “!#$%&’*?`{|}~” (MAILADDR_ESCAPE) тэмдэгтүүдийг орлуулдаг. Дараа нь mda_expand_token()-д бэлтгэсэн мөрийг 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' командыг ашиглан хүргэх агент (MDA) руу залгахад ашиглагддаг. . /bin/sh-ээр mbox руу үсэг оруулах тохиолдолд “/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}” мөрийг ажиллуулж, “%” гэсэн утгатай. {mbox.from}” нь "MAIL FROM" параметрээс гарсан өгөгдлийг агуулдаг.
Эмзэг байдлын мөн чанар нь smtp_mailaddr() нь логик алдаатай байдаг бөгөөд үүний улмаас хэрэв хоосон домэйн имэйл рүү илгээгдсэн бол уг функц нь "@" тэмдэгтийн өмнөх хаяг хүчингүй тэмдэгт агуулсан байсан ч амжилттай баталгаажуулах кодыг буцаадаг. . Цаашилбал, стринг бэлтгэх үед mda_expand_token() функц нь бүх боломжит бүрхүүлийн тусгай тэмдэгтүүдээс зугтдаггүй бөгөөд зөвхөн имэйл хаягт зөвшөөрөгдсөн тусгай тэмдэгтүүдийг оруулдаг. Тиймээс тушаалаа ажиллуулахын тулд имэйлийн дотоод хэсэгт ";" тэмдгийг ашиглахад хангалттай. болон зай, эдгээр нь MAILADDR_ESCAPE багцад ороогүй бөгөөд гадагш гарахгүй. Жишээлбэл:
$nc 127.0.0.1 25
HELO профессор.falken
ШУУД:
RCPT TO:
МЭДЭЭЛЛИЙН
.
татахаа больсон
Энэ сессийн дараа OpenSMTPD нь mbox-д хүргэх үед бүрхүүлээр дамжуулан тушаалыг ажиллуулна
/usr/libexec/mail.local -f ;sleep 66; үндэс
Үүний зэрэгцээ, хаягийн дотоод хэсэг нь 64 тэмдэгтээс хэтрэхгүй, зугтах үед '$' болон '|' тусгай тэмдэгтүүдийг ":" -ээр сольсон тул халдлагын боломж хязгаарлагдмал. Энэ хязгаарлалтыг тойрч гарахын тулд бид /usr/libexec/mail.local-ыг оролтын урсгалаар ажиллуулсны дараа үсгийн биеийг дамжуулдаг болохыг ашигладаг, өөрөөр хэлбэл. Хаягийг өөрчилснөөр та зөвхөн sh командын орчуулагчийг ажиллуулж, үсгийн хэсгийг зааврын багц болгон ашиглаж болно. Үйлчилгээний SMTP толгойг үсгийн эхэнд зааж өгсөн тул тэдгээрийг алгасахдаа унших командыг давталтаар ашиглахыг зөвлөж байна. Ажиллаж буй мөлжлөг нь дараах байдалтай харагдана.
$nc 192.168.56.143 25
HELO профессор.falken
MIL FROM:
RCPT TO:<[имэйлээр хамгаалагдсан]>
МЭДЭЭЛЛИЙН
#0
#1
...
#d
for i in W O P R; хийх
echo -n "($i) " && id || завсарлага
хийсэн > /root/x."`id -u`.""$$"
.
татахаа больсон
Эх сурвалж: opennet.ru