SE / proc / PID / স্থিতি` - এ যখন SETUID ব্যবহার করা হয় তখন ভুল ইআইইউড


1

একটি ওয়ারমেমে চ্যালেঞ্জ করার সময়, আমি অনুমতি নিয়ে একটি ইস্যুতে ছুটে এসেছি। প্রদত্ত তথ্য /proc/PID/statusপ্রক্রিয়াটিতে যে অনুমতিগুলি দেওয়া উচিত তা পূর্ণতার সাথে নয়।

আমি ব্যবহারকারী ব্যবহারকারী 1। আমার একটি প্রোগ্রাম যা সেটুডাইজড সেগুলি ব্যবহার করার কথা:

-r-sr-x---  1 user2 user1       6297 Jun 20  2013 program

সুতরাং এটি ব্যবহারকারীর কার্যকর ইউআইডি দিয়ে কার্যকর করা উচিত।

প্রোগ্রামটি বন্ধ হওয়া থেকে রোধ করার জন্য আমি অস্থায়ীভাবে প্রোগ্রামটি চালু করার ঠিক পরে বন্ধ করছি:

~/program "test" &
PID=$!
kill -SIGSTOP $PID
echo $PID

তারপরে, আমি cat /proc/$PID/statusএবং আমি দেখতে পাচ্ছি:

Uid:    1003    1003    1003    1003
Gid:    1003    1003    1003    1003

আইডিগুলি হ'ল:

$ id user1
uid=1003(user1) gid=1003(user1) groups=1003(user1)
$ id user2
uid=1035(user2) gid=1035(user2) groups=1035(user2),1003(user1)

ম্যানুয়াল দেওয়া ( man 5 proc) দেওয়া /proc/$PID/statusউচিত shouldUid, Gid: Real, effective, saved set, and filesystem UIDs (GIDs).

তবে এখানে, প্রক্রিয়াটির ব্যবহারকারীর কার্যকর আইডি রয়েছে যেখানে এটি ব্যবহারকারীর কার্যকর আইডি থাকা উচিত

আমি ভেবেছিলাম, কারণ আমি খুব তাড়াতাড়ি প্রোগ্রাম বন্ধ এই হতে পারে, তাই আমি সংযুক্ত করার চেষ্টা gdbএটি, ও মৃত্যুদন্ড অবিরত পর্যন্ত এটা আসলে থেকে কোড executes mainফাংশন program(সূত্র দেওয়া হয়), কিন্তু কর্তৃক প্রদত্ত কার্যকর ইউআইডি /proc/$PID/statusএখনও এক ইউজার 1 এবং ইউজার 2 এর নয়।

আমি কিছু অনুপস্থিত করছি?

সম্পাদনা করুন: চ্যালেঞ্জের উত্সটি সরিয়ে দিন, আমি সম্ভবত এটি পোস্ট করার জন্য অনুমোদিত নই।


@ চাওস সোর্স যুক্ত হয়েছে।
49

উত্তর:


3

এর কারণ আপনি খুব তাড়াতাড়ি, আপনি যদি ইউআইডি পরিবর্তন না হওয়া পর্যন্ত অপেক্ষা করেন তবে আপনার প্রক্রিয়াটি যেমন চলছে user2। এটি আমার পক্ষে কাজ করেছে:

./program "test" &
PID=$!
sleep 0.0005
kill -SIGSTOP $PID
grep ^Uid /proc/$PID/status

আরেকটি চেষ্টা হ'ল তার সাথে একটি বিলম্ব যুক্ত করা usleep()এবং SIGSTOPসেই ঘুমের সময় পরে প্রেরণ করা । তারপরে প্রোগ্রামটি user2কার্যকর ইউআইডি দিয়ে চলে। আপনি এটি যাচাই করতে পারেন, gdbবা এর সাথে সংযুক্ত না করে strace। সম্ভবত এটি কোনও ধরণের লিনাক্স কার্নেল ইন্টার্না রয়েছে, ইউআইডি পরিবর্তন করতে প্রক্রিয়াটির কিছুটা সময় প্রয়োজন।

টার্মিনাল থেকে প্রক্রিয়া চলাকালীন execve()সিস্টাল বলা হয়; ম্যানপেজ থেকে:

যদি ফাইল-নাম দ্বারা চিহ্নিত প্রোগ্রামের ফাইলটিতে সেট-ব্যবহারকারী-আইডি বিট সেট করা থাকে, [...] এবং কলিং প্রক্রিয়াটি ট্র্যাক করা হচ্ছে না, তবে কলিং প্রক্রিয়াটির কার্যকর ব্যবহারকারী আইডি এর মালিকের পরিবর্তে পরিবর্তিত হবে প্রোগ্রাম ফাইল।

যখন আপনি gdbপ্রক্রিয়াটির সাথে সংযুক্ত হন, আপনি ইউআইডিটি দেখতে পাবেন না user2, কারণ ptraceউপরের ম্যানুয়াল পৃষ্ঠায় বর্ণিত হিসাবে আপনি প্রক্রিয়াটি করছেন । অন্যথায় আপনি একটি- sudoপ্রসেসের সাথে সংযুক্ত করতে এবং রুট অনুমতিগুলি পেতে পারেন।

যাইহোক, এই প্রোগ্রামটি কখনই কোনও সেগমেন্টেশন ফল্ট ( SIGSEGV) পায় না , যদি না আপনি কোনওটিকে বাধ্য করেন kill -SIGSEGV $PIDযদি আপনার প্রোগ্রাম পায় একটি রুটিন বলা হয়। এটি কোনও আর্গুমেন্ট ছাড়াই কেবল আপনার বাইনারি- কে আর্গুমেন্ট হিসাবে কল করবে যা বর্তমান চলমান প্রক্রিয়াটিকে প্রতিস্থাপন করবে। সুতরাং ডিবাগারে প্রাইভেলিজ থাকবে এবং অতএব আপনি সেখানে যা চান তা করতে পারেন, অনুমতি নিয়ে।SIGSEGVlaunch_debugger()gdbprogramuser2user2

আপনি তারপরে, উদাহরণস্বরূপ, নিম্নলিখিত ভিতরে করতে পারেন gdb:

(gdb) file bash
Reading symbols from /bin/bash...(no debugging symbols found)...done.
(gdb) run
Starting program: /bin/bash
user2@host:~$ id
uid=1035(user2) gid=1003(user1) groups=1035(user2),1003(user1)

এখন, সেটুইড বিটের সাথে একই বাইনারিটি বিবেচনা করুন এবং মালিকটি মূল।


আপনার বিস্তারিত উত্তরের জন্য আপনাকে অনেক ধন্যবাদ, এটি আমার সমস্যার ঠিক সমাধান করেছে। আমি কেবল ভেবে sleep 0.0005দেখিনি, এবং আমি সন্দেহ করেছিলাম যে আমি সংযুক্তির মাধ্যমে অনুমতিগুলি কমিয়ে gdbদিচ্ছি, তবে আমি এ সম্পর্কে কোনও দলিল খুঁজে পাচ্ছি না। আমি ম্যান পেজটি দেখেছি execve, তবে আমি জানতাম না যে gdbএটি ব্যবহার করছে ptrace(বেশিরভাগ কারণেই আমি ptraceআসলে কী জানি না) aw এখন আপনি এটি উল্লেখ করেছেন, এটা সুস্পষ্ট।
49

এডিটওয়ারের জন্য @vmarquet sry, তবে আমার উত্তরের প্রয়োজনীয় অংশটি মুছে ফেলা সঠিক উপায় নয়, আপনি যেমন চান তেমনভাবে আমি ব্যবহারকারীর নাম পরিবর্তন করেছি এবং আমি চ্যালেঞ্জ সম্পর্কিত আমার সমস্ত মন্তব্য মুছে ফেলব।
বিশৃঙ্খলা

ঠিক আছে, দুঃখিত, যতক্ষণ না চ্যালেঞ্জটি সনাক্ত করতে পারে এমন কোনও জিনিসের উল্লেখ নেই (প্রোগ্রামের নাম বা ব্যবহারকারীর নাম), তবে ঠিক আছে।
vmarquet

1

প্রোগ্রামটি কি এমন কোনও ফাইল সিস্টেমে চলছে যা setuidফাইলগুলিতে বিটকে সম্মান জানায় ( mount -o nosuid)?

যদি আমি এটি ডিবাগ করছিলাম তবে আমি বিটটিকে সম্মানিত করা হচ্ছে কিনা তা দেখতে getuid()এবং geteuid()প্রোগ্রামের শুরুতে আউটপুট প্রিন্ট করব wouldsetuid


এটি পরীক্ষা করার জন্য আমার কাছে সিস্টেমে পর্যাপ্ত অ্যাক্সেস নেই। তবে এটি দুর্বলতার সাথে একটি SETUID প্রোগ্রামটি শোষণ করার জন্য ওয়ারগেমের মূলনীতি। তারা যদি ব্যবহার mount -o nosuidকরত তবে চ্যালেঞ্জগুলি অসম্ভব হত।
ভের্মোয়াট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.