რატომ იცვლება პორტების სკანირება sudo-ით გაშვებისას
როცა ნედლი სოკეტები მიუწვდომელია, Nmap ჩუმად ცვლის SYN სკანირებას TCP connect სკანირებით, ამიტომ root და ჩვეულებრივი მომხმარებელი სხვადასხვა გზას ზომავს.
Nmap ყოველთვის არ აგზავნის იმ პაკეტს, რომელიც თქვენ გგონიათ, რომ მოითხოვეთ. როცა ნედლი სოკეტები მიუწვდომელია, ის ნაგულისხმევ SYN სკანირებას ცვლის TCP connect სკანირებით, ამიტომ ჩვეულებრივი მომხმარებლის როლში გაშვებამ და sudo-ის ქვეშ გაშვებამ შეიძლება ერთი და იმავე პორტის შესახებ სხვადასხვა კითხვას უპასუხოს. შედეგები უფლებების პრობლემას ჰგავს, თუმცა, როგორც წესი, მეთოდის ცვლილებაა. მეთოდის ცხადად გამოხატვა ერთადერთი გზაა, რომ ორი გაშვება საერთოდ შევადაროთ.
ორი ზონდი, ერთი პორტი, სხვადასხვა კოდის გზები
SYN სკანირება თავად აშენებს TCP სათაურს, აგზავნის მას ნედლი სოკეტიდან და პასუხს ქსელიდან კითხულობს მანამ, სანამ ბირთვის TCP სტეკი დასრულებულ კავშირს ჩაწერს. connect სკანირება ოპერაციულ სისტემას სთხოვს ჩვეულებრივი სოკეტის გახსნას და აცნობებს, თუ რას აბრუნებს connect(). ორივეს შეუძლია პორტს ღია უწოდოს, მაგრამ მხოლოდ ერთი ტოვებს ნახევრად ღია მცდელობას და მხოლოდ ერთი ექვემდებარება გამომგზავნ პროცესთან დაკავშირებულ სოკეტის დონის პოლიტიკას.
ნედლ გზას სჭირდება CAP_NET_RAW, ამიტომ ნაგულისხმევი სკანირება ჩუმად უარესდება, როცა ეს შესაძლებლობა აკლია. Nmap-ის საკუთარი სკანირების ტექნიკების ცნობარი ადასტურებს ამ ჩანაცვლებას: connect სკანირება სარეზერვოა, რადგან მას საერთოდ არ სჭირდება განსაკუთრებული უფლებები. ჩანაცვლება ხდება გაფრთხილების გარეშე გაშვებების უმეტესობაში, და სწორედ ეს ხდის მას ასე ადვილად არასწორად წასაკითხად. როგორც კი იცით, რომ სარეზერვო არსებობს, «ღია როგორც root, დახურული როგორც მომხმარებელი» წყვეტს უფლებების ხარვეზად ჟღერადობას და იწყებს ორ სხვადასხვა გაზომვად ჟღერადობას.
რას ცვლის sudo სინამდვილეში სკანირებაში
უფლებების ამაღლება აბრუნებს ნედლი სოკეტის გზას, და ეს ვერდიქტზე მეტს ცვლის. წყარო პორტის არჩევა, პაკეტების დროში განლაგება, ხელახალი გაგზავნის ქცევა და გაფილტრული პასუხის კლასიფიკაციის წესი ყველა სხვადასხვა კოდიდან მოდის. SYN-ების სიჩქარის შემზღუდველი შუალედური მოწყობილობა ორ გაშვებას არათანაბრად ეპყრობა მაშინაც, როცა დანიშნულების ჰოსტი იდენტურია.
დანიშნულების მხარეს ლოგირებაც განსხვავდება. დასრულებული ხელის ჩამორთმევა ხილულია სერვისისთვის და ნებისმიერი სოკეტის აღრიცხვისთვის, მაშინ როცა განულებული ნახევრად ღია ზონდი ხშირად არ არის. თუ გაშვებებს ადარებთ ჰოსტს, რომლის ლოგებსაც კითხულობთ, ნანახი სხვაობის ნაწილი თავად დაკვირვებაა.
მეთოდი უცვლელად შეინარჩუნეთ ორივე გაშვებაში
აიძულეთ იგივე ტექნიკა ორივე გამოძახებაში და შედარება მნიშვნელობის შეძენას დაიწყებს. -sT დროშა ცხადად ითხოვს connect სკანირებას, -Pn ხსნის ჰოსტების აღმოჩენას, -n ხსნის სახელების ამოხსნას, და ერთი -p ხსნის პორტების სიის სხვაობებს.
nmap -sT -Pn -n -p 8443 198.51.100.77
sudo nmap -sT -Pn -n -p 8443 198.51.100.77
მისამართი და პორტი შეცვალეთ ჰოსტით, რომლის ტესტირების უფლებაც გაქვთ; ზემოთ მოცემული დოკუმენტაციის დიაპაზონი ნიმუშია და არა სამიზნე. თუ ორი გაშვება ახლა ემთხვევა, საწყისი განსხვავება სკანირების მეთოდიდან მოდიოდა. თუ კვლავ არ ემთხვევა, სხვა რაღაც კლასიფიცირებს ტრაფიკს, და შემდეგი განყოფილებაა ადგილი, სადაც უნდა ვიხილოთ.
ანგარიშის კონტექსტი მხოლოდ უფლების დროშა არ არის
VPN-ის განთავსებას შეუძლია პაკეტები კლასიფიციროს UID-ით, cgroup-ით, ან სოკეტის გამხსნელ პროცესთან დაკავშირებული წესით. მაშინ root-ის და მომხმარებლის ტრაფიკი სხვადასხვა მარშრუტიზაციის ცხრილებიდან გადის ან სხვადასხვა წესების სიმრავლეს ეჯახება, და სკანირების მეთოდის არცერთი დისციპლინა ვერ შეათანხმებს მათ.
შეამოწმეთ პოლიტიკა და არა უფლება. Linux-ში nftables ამას meta skuid-ით გამოხატავს, ხოლო iptables მფლობელის დამთხვევით, და ნებისმიერს შეუძლია ერთი UID გაუშვას გვირაბში, სანამ მეორე განაგრძობს ფიზიკური ნაგულისხმევი მარშრუტის გამოყენებას.
sudo nft list ruleset | grep -n skuid
sudo iptables-save | grep -n uid-owner
ip rule show
ip route get 198.51.100.77
შედეგების შედარებამდე დაადასტურეთ ზონდი
დასკვნების გაკეთებამდე დაამტკიცეთ, რომელი ზონდი გაეშვა. Nmap ტექნიკას თავისივე გამოსავალში ასახელებს, და --reason ყოველი მდგომარეობის მიღმა მტკიცებულებას ამატებს, და სწორედ ეს ნაწილი გეუბნებათ, ნამდვილად დასრულდა თუ არა ხელის ჩამორთმევა.
nmap --reason -sT -Pn -n -p 8443 198.51.100.77
sudo nmap --reason -sS -Pn -n -p 8443 198.51.100.77
getcap "$(command -v nmap)"
capsh --print | grep -i net_raw
ორი გაშვება, რომლებიც ერთსა და იმავე მდგომარეობას სხვადასხვა მიზეზით აცნობებენ, წინააღმდეგობა არ არის, და ორი გაშვება, რომლებიც სხვადასხვა მდგომარეობას ერთი და იმავე მიზეზით აცნობებენ, მარშრუტიზაციაზე ან პოლიტიკაზე მიუთითებენ და არა სკანირებაზე. დანიშნულება, პორტი, სახელთა სივრცე და დროში განლაგება იდენტურად შეინარჩუნეთ, შემდეგ თითო ცვლადი შეცვალეთ. სერვისის root-ად გაშვება პოლიტიკის შეუთანხმებლობის შეკეთება არ არის; შეკეთებაა განზრახული პოლიტიკის გამოხატვა სერვისის მფლობელის მეშვეობით.