LƯU Ý: Đây chủ yếu là một chương trình (shell script) tôi đã thực hiện và tôi biết diễn đàn này là một trang web trả lời câu hỏi hơn là giới thiệu chương trình. Nhưng tôi không có bất kỳ tài khoản GitHub (hoặc tương tự) nào, tôi cũng không có thời gian để nghiên cứu về phương pháp xuất bản chương trình Nguồn mở ra cộng đồng. Vì vậy, miễn là có một rủi ro là một chương trình hữu ích và hữu ích không được chú ý (thậm chí trong nhiều tháng) cho những người có thể thưởng thức nó, và thật buồn khi không chia sẻ một chương trình đã được thực hiện, tôi sẽ xuất bản nó ở đây cho hiện nay. Không có vấn đề với tôi nếu quản trị viên quyết định loại bỏ chủ đề này, tôi sẽ hiểu. Tôi hy vọng đã diễn đạt vấn đề
theo cách trả lời câu hỏi đủ để làm cho nó hữu ích cho diễn đàn này. Nếu có đủNgười dùng quan tâm , tôi sẽ cố gắng hết sức để dành thời gian tiếp tục dự án (sau tất cả các nghiên cứu của tôi, tôi không tìm thấy bất cứ điều gì gần nhất với điều này trên Internet, nhưng, tôi không biết liệu kịch bản của mình có giá trị hay nó đã lãng phí thời gian)
Tôi đã lập trình một tập lệnh shell Linux đơn giản hoạt động (cho đến bây giờ) trên CygWin và giúp (tôi hy vọng) giảm SUDO cho khoảng thời gian tấn công của CygWin. Chương trình được đặt tên là TOUACExt (viết tắt của " TimeOut và UAC Extension ") và hoạt động như một trình bao bọc cho SUDO cho CygWin (được cài đặt bắt buộc) và thực sự được tạo bởi một bộ bốn .sh
chương trình.
Các tính năng :
- Sử dụng thoải mái : Bằng cách mô phỏng sudo gốc từ hành vi Linux, lời nhắc yêu cầu xác nhận UAC chỉ xuất hiện một lần (nhiều
sudo
lệnh liên tiếp sẽ chỉ tạo một yêu cầu UAC). Miễn là sudoserver.py tiếp tục chạy (mặc định 15 phút), sẽ không có thêm yêu cầu UAC .
- Người dùng đặc quyền (Quản trị viên) chỉ nhận được yêu cầu xác nhận UAC ( Có / Không ) trên màn hình.
- Người dùng không có đặc quyền (không phải Quản trị viên) có được màn hình nhập mật khẩu / tài khoản Quản trị viên .
- sudoserver.py tiếp tục chạy, sau đó đóng tự động sau thời gian được xác định trước (15 phút) từ lần thực hiện lệnh sudo cuối cùng.
- sudoserver.py không đóng (tiếp tục chạy và sẽ kiểm tra lại sau 5 phút) trong trường hợp có bất kỳ trường hợp nào chạy sudo .
- Hoạt động từ xa (được kiểm tra qua SSH):
- Người dùng không có đặc quyền không thể bắt đầu sudoserver.py từ xa.
- Tạo một (nhưng đơn giản và không phải là rất có thể đọc được) log vào
/var/log/SUDOForCygWin/
.
Yêu cầu (bằng CygWin):
- SUDO cho CygWin .
- pgrep (tại
procps
gói).
- đàn (theo
util-linux
gói).
- nohup (Tôi nghĩ được cài đặt theo mặc định trên CygWin, nhưng không chắc chắn).
Giả sử : - Hai chương trình của dự án SUDO cho CygWin trên đường dẫn được đề xuất bởi tác giả:
/usr/local/bin/sudoserver.py
/usr/local/bin/sudo
TOUACExt đã được thử nghiệm hoạt động trên Windows 7 SP1 và Windows XP SP3, nhưng tôi không biết liệu nó có hợp lý khi sử dụng nó trên cái cuối cùng này không.
Hướng dẫn cài đặt :
Đặt tập lệnh này (tên được đề xuất SUDOServer.cmd
:) và tạo một lối tắt (bạn có thể cá nhân hóa biểu tượng của nó nếu bạn muốn) với tên được đặt SUDOServer.lnk
(bạn phải bật trên phím tắt này Advanced Options --> Execute as Administrator
) ở bất kỳ đâu trên đường dẫn Windows của bạn , vì vậy sudoserver.py
có thể được yêu cầu trực tiếp từ Windows:
c:\CygWin\bin\python2.7.exe /usr/local/bin/sudoserver.py
Đặt bốn tập lệnh .sh của TOUACExt trên đường dẫn, ví dụ:
/usr/local/bin/SUDO.sh
/usr/local/bin/SUDOServer.sh
/usr/local/bin/SUDOServerWatchDog.sh
/usr/local/bin/SUDOServerWatchDogScheduler.sh
Đổi tên tập lệnh Python gốc từ sudo
thành sudo.py
:
mv /usr/local/bin/sudo /usr/local/bin/sudo.py
CẢNH BÁO: Tập lệnh Python "sudo" ban đầu không được giữ ở bất kỳ đâu trong đường dẫn của bạn hoặc thay vào đó có thể được thực thi.
Tạo bí danh này (ví dụ: thủ công hoặc bằng cách chỉnh sửa của bạn ~/.bashrc
):
alias sudo='SUDO.sh'
Mã cho SUDO.sh :
#!/bin/bash
# ********** SUDO.sh v0.04a **********
# Variables:
# LockFile (will use a temporal one for now):
#lockfile=sudoserver-running.lck
LockFile=lockfile.lck
# Creating LogFile (if it does not exist):
mkdir /var/log/SUDOForCygWin 2>/dev/null
chmod 777 /var/log/SUDOForCygWin 2>/dev/null
LogFile=/var/log/SUDOForCygWin/$(date +%Y%m%d).log
exec 5>>$LogFile # Redirector 5 will be the log file.
chmod 777 $LogFile >&5 2>&5 # Writable to anyone (for now).
# Start of the program
echo "========== Starting SUDO Server for CygWin ==========" >&5
echo $(date) >&5
# does the lock file exists as locked?
if [ $(flock -n $TMP/$LockFile echo>/dev/null;echo $?) -eq 0 ]
then
# The lock file is not locked.
echo "LockFile not locked. Testing sudo access..." >&5
if [ $(sudo.py vartemp=0>/dev/null 2>/dev/null;printf $?) -eq 0 ]
then
# Wooops. sudoserver.py is running without the lockfile. Better to correct this.
echo "LockFile not locked, but sudoserver.py seems to be running." >&5
printf "Killing sudoserver.py...\n" >&5
sudo.py kill $(sudo.py pgrep.exe -f -l sudoserver.p[y] | grep "pgrep" -v | awk '{print $1}') >&5 2>&5
fi
# Starting SUDOServer.sh
printf "Requesting SUDOServer start...\n" >&5
nohup SUDOServer.sh >&5 2>&1&
# Wait some time delay for UAC Prompt to start
sleep 2
timeout=$((SECONDS+10))
# Has sudoserver.py already started?
while [ $(flock -w 1 $TMP/$LockFile echo>/dev/null;printf $?) -eq 0 ] || [ $(tasklist | grep "consent.exe" -i>/dev/null;printf $?) -eq 0 ]
do
# No. We have to wait.
# Waiting for SUDOServer.py to be running.
printf "."
if [ $SECONDS -ge $timeout ]
then
# sudoserver.py not responding. Aborting with errorlevel=3.
printf "sudoserver.py not responding. Aborting.\n"
exit 3
fi
done
# Yes. sudoserver.py is up and running.
fi
printf "\n"
# Schedule (add) SUDOServer Watch Dog to Task Scheduler:
SUDOServerWatchDogScheduler.sh
# Invoke requested sudo command
sudo.py $@
#printf "ErrorLevel was: "$?
# ErrorLevel Codes:
# 3 --> timeout waiting for sudoserver.py to respond.
Mã cho SUDOServer.sh :
#!/bin/bash
# ********** SUDOServer.sh v0.04a **********
# Variables:
# LockFile (a temporal one for now):
#lockfile=sudoserver-running.lck
LockFile=lockfile.lck
# Check for other instances of sudoserver.py running
if [ $(flock -n $TMP/$LockFile echo>/dev/null;printf $?) -eq 0 ]
then
printf "Creating lockfile: "$TMP/$LockFile"\n"
flock $TMP/$LockFile -c 'cmd /c SUDOServer'
# The file has been unlocked. Send error level=2.
exit 2
else
printf "The lockfile: "$TMP/$LockFile" is locked by another process.\n"
printf "Exiting SUDOServer.sh"
fi
printf "SUDOServer.sh execution finished. Exiting."
# Exiting with no problems.
exit 0
# ErrorLevel Codes:
# 2 --> SUDOServer.lnk (maybe denial of UAC).
Mã cho SUDOServerWatchDog.sh :
#!/bin/bash
# ********** SUDOServerWatchDog.sh v0.04a **********
# Variables:
# LockFile (a temporal one for now):
#lockfile=sudoserver-running.lck
LockFile=lockfile.lck
# Redirecting to LogFile:
LogFile=/var/log/SUDOForCygWin/$(date +%Y%m%d).log
exec 5>>$LogFile
if [ $(stat $LogFile -c %a) -ne 777 ]
then
echo "Logfile "$LogFile" has incorrect permissions." >&5
echo "Attemping to change permissions of "$LogFile >&5
chmod 777 $LogFile >&5 2>&5
fi
# Remove Task Scheduler entry, if exists.
if [ $(schtasks.exe /query | grep "SUDOServerWatchDog" -i>/dev/null 2>&5;printf $?) -eq 0 ]
then
sudo.py schtasks.exe /delete /tn "SUDOServerWatchDog" /f >&5 2>&5
fi
# Is sudoserver.py running?
if [ $(flock -n $TMP/$LockFile echo>/dev/null;printf $?) -eq 1 ] || [ $(sudo.py vartemp=0>/dev/null 2>/dev/null;printf $?) -eq 0 ]
then
# Yes. sudoserver.py is running. So...
printf "sudoserver.py detected running...\n" >&5
# Is any instance of sudo running right now?
if [ $(sudo.py pgrep -f -l "/usr/local/bin/sudo.py " | grep -v grep>/dev/null 2>&5;printf $?) -eq 0 ]
then
# Yes. sudo is running right now. So...
printf "There are instances of sudo running.\n" >&5
sudo.py schtasks /create /tn "SUDOServerWatchDog" /tr "SUDOServerWatchDog" /sc minute /mo 5 /sd 10/10/2010 /ru "SYSTEM" >&5 2>&5
printf "Will check again in 5 minutes. Adding Task.\n" >&5
else
# No. sudo is not running right now. So...
# Kill sudoserver.py.
printf "Closing sudoserver.py\n" >&5
sudo.py kill $(sudo.py pgrep.exe -f -l sudoserver.p[y] | grep "pgrep" -v | awk '{print $1}')
fi
else
printf "sudoserver.py not running. Nothing to be done.\n" >&5
fi
Mã cho SUDOServerWatchDogScheduler.sh :
#!/bin/bash
# ********** SUDOWatchDogScheduler.sh v0.04a **********
# Check if WatchDog is already scheduled
if [ $(schtasks.exe /query | grep "SUDOServerWatchDog">/dev/null 2>&5;printf $?) -eq 0 ]
then
# Yes. Remove it in order to create a new one.
echo "Task SUDOServerWatchDog already existing." >&5
echo "Removing task SUDOServerWatchDog..." >&5
sudo.py schtasks.exe /delete /tn "SUDOServerWatchDog" /f >&5 2>&5
if [ $? -eq 0 ]
then
# Task correctly deleted.
echo "Task correctly removed." >&5
else
# Something failed in task creation. Report.
echo "ERROR on deleting the SUDOServerWatchDog programmed task." >&5
fi
fi
# Schedule new task for deletion.
echo "Adding new SUDOServerWatchDog task to trigger in 15 minutes." >&5
sudo.py schtasks /create /tn "SUDOServerWatchDog" /tr "SUDOServerWatchDog" /sc minute /mo 15 /sd 10/10/2010 /ru "SYSTEM" >&5 2>&5
if [ $? -eq 0 ]
then
# Task correctly scheduled.
echo "Task SUDOServerWatchDog correctly scheduled." >&5
else
# Something failed in task scheduling. Report.
echo "ERROR on scheduling programmed task SUDOServerWatchDog." >&5
fi
Kiểm tra chương trình từ trình bao CygWin Bash:
Luis@Kenobi ~
$ sudo ls -la
<UAC ELEVATION PROMPT APPEARS>
total 49
drwxr-xr-x+ 1 Luis None 0 abr 7 02:23 .
drwxrwxrwt+ 1 Luis- None 0 abr 4 03:27 ..
-rw------- 1 Luis None 13798 abr 14 00:31 .bash_history
-rwxr-xr-x 1 Luis None 1494 mar 3 11:36 .bash_profile
-rwxr-xr-x 1 Luis None 6260 abr 6 05:19 .bashrc
-rwxr-xr-x 1 Luis None 1919 mar 3 11:36 .inputrc
-rw------- 1 Luis None 35 abr 2 01:43 .lesshst
-rwxr-xr-x 1 Luis None 1236 mar 3 11:36 .profile
drwx------+ 1 Luis None 0 mar 8 01:49 .ssh
-rw-r--r-- 1 Luis None 7 mar 4 18:01 d:ppp.txt
-rw-r--r-- 1 Luis None 37 abr 7 02:23 my.log
LƯU Ý 2: Các tập lệnh này đang ở phiên bản tiền beta , vì vậy chúng vẫn có lỗi và mã không được sạch sẽ cho lắm. Dù sao, trong các thử nghiệm của tôi với ba máy tính Windows 7 khác nhau, chúng dường như đang hoạt động (chủ yếu) OK.
Giải thích ngắn gọn về chương trình:
- Do bí danh, khi thực hiện lệnh sudo, tập lệnh SUDO.sh được gọi.
- SUDO.sh gọi SUDOServer.sh , mở (thông qua
SUDOServer.lnk
) "sudoserver.py" nếu cần.
- Lệnh sudo gốc được gọi bởi người dùng được thực thi.
- Sau đó SUDO.sh gọi SUDOServerWatchDogScheduler.sh , lên lịch SUDOServerWatchDog.sh để thực thi sau thời gian đã cho (mặc định 15 phút) để đóng
sudoserver.py
.
- Sau thời gian được xác định trước, SUDOServerWatchDog.sh sẽ đóng sudoserver.py . Nếu có bất kỳ trường hợp nào của sudo đang chạy , nó sẽ tự lập trình để thực hiện mới sau 5 phút.
Để làm :
- Tự cài đặt tự động tạo tất cả các tệp .sh, .cmd và .lnk.
- Thiết lập tệp khóa cho một số khác (nó ở mức $ TMP / lockfile.lck).
- Thêm tập lệnh cấu hình hoặc tệp .config (để mặc định trong thời gian chờ, vị trí tệp ... vv).
- Thêm hành vi tài khoản hệ thống (cảm ơn, @ Wyatt8740).
- Thay đổi "bầy" (khóa chế độ SUDO bên trong) bằng "bộ nhiệt áp" khi thích hợp?
- Gợi ý được chấp nhận.
Báo cáo lỗi :
- Shell bash tiếp tục mở ngay cả sau khi nhập
exit
nếu sudoserver.py
đang chạy cho đến khi nó đóng. Giải pháp tạm thời được chào đón.
Tôi hy vọng ai đó sẽ sử dụng chương trình dài mà tôi dành riêng cho TOUACExt.
Cải tiến và sửa chữa được chấp nhận.
Gợi ý về nơi tôi nên xuất bản mã để ngừng cằn nhằn diễn đàn này cũng được chấp nhận ;-).
Xin lôi vi bai đăng dai. Tôi không có nhiều thời gian rảnh, và dự án này đã biến mất trong tủ quần áo của tôi (có thể trong nhiều năm, ai biết được?).