==Phrack Classic== Volume Three, Issue 32, File #8 of 12 +-------------------------------+ | Inside the SYSUAF.DAT file of | +-------------------------------+ +------------------------------------------------------+ | Digital Equipment Corporation's VMS Operating System | +------------------------------------------------------+ -= by =- -----:> Pain Hertz <:---- Overview ~~~~~~~~ In this file, I will explain what the System User Authorization File is, what information it contains, what the logical and physical characteristics of the file are, and how one can manipulate it to reveal and/or modify its contents. Background ~~~~~~~~~ The Virtual Memory System (VMS) Operating System's System User Authorization File (SYSUAF) contains the information that determines a given user's username, password(s), security priviledges, as well as many other similar data which either allow or disallow the user to have the system perform certain tasks. Characteristics ~~~~~~~~~~~~~~~ The SYSUAF.DAT file (UAF) is usually located on the system on the device pointed to by the logical SYS$COMMON, and under the [SYSEXE] subdirectory. However, if the logical SYSUAF exists, it will point to the location and name of the UAF. The UAF is a binary, indexed data file. It's indexed on 4 keys: username, UIC, extended user identifier, and owner identifier. Using the VMS ANALYZE utility reveals the following about the UAF: IDENT "01-JAN-1990 13:13:13 VAX/VMS ANALYZE/RMS_FILE Utility" SYSTEM SOURCE VAX/VMS FILE ALLOCATION 24 BEST_TRY_CONTIGUOUS yes BUCKET_SIZE 3 CLUSTER_SIZE 3 CONTIGUOUS no EXTENSION 3 FILE_MONITORING no GLOBAL_BUFFER_COUNT 0 NAME "SYS$COMMON:[SYSEXE]SYSUAF.DAT;1" ORGANIZATION indexed OWNER [SYSTEM] PROTECTION (system:RWED, owner:RWED, group:RWED, world:RE) RECORD BLOCK_SPAN yes CARRIAGE_CONTROL none FORMAT variable SIZE 1412 AREA 0 ALLOCATION 9 BEST_TRY_CONTIGUOUS yes BUCKET_SIZE 3 EXTENSION 3 AREA 1 ALLOCATION 3 BUCKET_SIZE 3 EXTENSION 3 AREA 2 ALLOCATION 12 BUCKET_SIZE 2 EXTENSION 12 KEY 0 CHANGES no DATA_KEY_COMPRESSION yes DATA_RECORD_COMPRESSION yes DATA_AREA 0 DATA_FILL 100 DUPLICATES no INDEX_AREA 1 INDEX_COMPRESSION yes INDEX_FILL 100 LEVEL1_INDEX_AREA 1 NAME "Username" NULL_KEY no PROLOG 3 SEG0_LENGTH 32 SEG0_POSITION 4 TYPE string KEY 1 CHANGES yes DATA_KEY_COMPRESSION no DATA_AREA 2 DATA_FILL 100 DUPLICATES yes INDEX_AREA 2 INDEX_COMPRESSION no INDEX_FILL 100 LEVEL1_INDEX_AREA 2 NAME "UIC" NULL_KEY no SEG0_LENGTH 4 SEG0_POSITION 36 TYPE bin4 KEY 2 CHANGES yes DATA_KEY_COMPRESSION no DATA_AREA 2 DATA_FILL 100 DUPLICATES yes INDEX_AREA 2 INDEX_COMPRESSION no INDEX_FILL 100 LEVEL1_INDEX_AREA 2 NAME "Extended User Identifier" NULL_KEY no SEG0_LENGTH 8 SEG0_POSITION 36 TYPE bin8 KEY 3 CHANGES yes DATA_KEY_COMPRESSION no DATA_AREA 2 DATA_FILL 100 DUPLICATES yes INDEX_AREA 2 INDEX_COMPRESSION no INDEX_FILL 100 LEVEL1_INDEX_AREA 2 NAME "Owner Identifier" NULL_KEY yes NULL_VALUE 0 SEG0_LENGTH 8 SEG0_POSITION 44 TYPE bin8 ANALYSIS_OF_AREA 0 RECLAIMED_SPACE 0 ANALYSIS_OF_AREA 1 RECLAIMED_SPACE 0 ANALYSIS_OF_AREA 2 RECLAIMED_SPACE 0 ANALYSIS_OF_KEY 0 DATA_FILL 71 DATA_KEY_COMPRESSION 75 DATA_RECORD_COMPRESSION 67 DATA_RECORD_COUNT 5 DATA_SPACE_OCCUPIED 3 DEPTH 1 INDEX_COMPRESSION 85 INDEX_FILL 1 INDEX_SPACE_OCCUPIED 3 LEVEL1_RECORD_COUNT 1 MEAN_DATA_LENGTH 644 MEAN_INDEX_LENGTH 34 ANALYSIS_OF_KEY 1 DATA_FILL 7 DATA_KEY_COMPRESSION 0 DATA_RECORD_COUNT 4 DATA_SPACE_OCCUPIED 2 DEPTH 1 DUPLICATES_PER_SIDR 0 INDEX_COMPRESSION 0 INDEX_FILL 2 INDEX_SPACE_OCCUPIED 2 LEVEL1_RECORD_COUNT 1 MEAN_DATA_LENGTH 15 MEAN_INDEX_LENGTH 6 ANALYSIS_OF_KEY 2 DATA_FILL 8 DATA_KEY_COMPRESSION 0 DATA_RECORD_COUNT 4 DATA_SPACE_OCCUPIED 2 DEPTH 1 DUPLICATES_PER_SIDR 0 INDEX_COMPRESSION 0 INDEX_FILL 2 INDEX_SPACE_OCCUPIED 2 LEVEL1_RECORD_COUNT 1 MEAN_DATA_LENGTH 19 MEAN_INDEX_LENGTH 10 ANALYSIS_OF_KEY 3 ! This index is uninitialized - there are no records. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Examination ~~~~~~~~~~ Generally, an interactive user would use the AUTHORIZE utility to modify or examine the UAF, while a program would use the $GETUAI system services (get user authorization information service) to examine the file. The $GETUAI system services reference provide an excellent description of what fields the UAF contains, and how many bytes are used within the file to store each of those fields. However, it may not be within your realm of skills to program using system services. It would probably be considerably easier to use a sector editor/browser to locate values within the UAF. You could use a sector editor/browser online (such as VFE.EXE), or you you might choose to download the UAF and use an editor/browse for your personal computer. Regardless of which method you choose, you will have to know the offset of each field within the user authorization file. This is what I have provided for you. The contents of the UAF under VMS release 5.3-1 are as follows: Offset Description Length ----------------------------------------------------------------------------- 0 Record Header 4 4 Username (loginid) 32 36 Member UIC - Mem UIC decimal 1 = 0100 2 Mem UIC decimal 10 = 0A00 Mem UIC decimal 256 = FF01 38 Group UIC - Same as format as member UIC 2 Note: UICs as displayed in the VMS environment are OCTAL. A UIC of [010,001] would be saved as '01000800' in bytes 36-39 (offset). 40 Nulls 12 52 Account name 32 84 1 byte - value = length of owner 1 85 Owner 31 116 1 byte - value = length of device 1 117 Device (default disk device) 31 148 1 byte - length of default (SYS$LOGIN) directory 1 149 Default (SYS$LOGIN) directory name 63 212 1 byte - length of default login command file 1 213 Default login command file 63 276 1 byte - length of default CLI 1 277 Default command language interpeter 31 Note: CLI is assumed to be in SYS$SYSTEM directory and have an .EXE extension. 308 1 byte - length of user defined CLI tables 1 309 User defined CLI table name 31 340 Encrypted primary password 8 348 Encrypted secondary password 8 356 Number of login fails 2 358 Password encryption salt 2 360 Encryption algorithm code byte - primary password 1 361 Encryption algorithm code byte - secondary password 1 362 Password minimum length 1 363 Filler (1 byte) 1 364 Account expiration date 8 372 Password lifetime 8 380 Password change date/time - primary password 8 388 Password change date/time - secondary password 8 396 Last interactive login date/time 8 404 Last non-interactive login date/time 8 412 Authorize priviledges 8 420 Default priviledges 8 428 Filler (40 bytes) 40 468 Login Flags bits as follows: 4 7 6 5 4 3 2 1 0 ------------------------- | | | | | | | | | ------------------------- Byte Offset 468: Bit 0 - User can not use CTRL-Y Bit 1 - User is restricted to default command interpeter Bit 2 - SET PASSWORD command is disabled Bit 3 - Prevent user from changing any defaults at login Bit 4 - User account is disabled Bit 5 - User will not receive the login welcome message Bit 6 - Announcement of new mail is suppressed Bit 7 - Mail delivery to user is disabled Byte Offset 469: Bit 0 - User is required to use generated passwords Bit 1 - Primary password is expired Bit 2 - Secondary password is expired Bit 3 - All actions are audited Bit 4 - User will not receive last login messages Bit 5 - User can not reconnect to existing processes Bit 6 - User can only login to terminals defined by the automatic login facility (ALF) Bit 7 - User is required to change expired passwords Byte Offset 470: Bit 0 - User is restricted to captive account Bit 1 - Prevent user from executing RUN, MCR commands, or foreign commands at the DCL level Bits 2-7 - Reserved for future use Byte Offset 471: Bits 0-7 - Reserved for future use Note On Access Bytes: Each bit set represents a 1-hour period, from bit 0 as midnight to 1 a.m. to bit 23 as 11 p.m. to midnight. 472 Network access bytes - primary days 3 475 Network access bytes - seconday days 3 478 Batch access bytes - primary days 3 481 Batch access bytes - seconday days 3 484 Local access bytes - primary days 3 487 Local access bytes - seconday days 3 490 Dialup access bytes - primary days 3 493 Dialup access bytes - secondary days 3 496 Remote access bytes - primary days 3 499 Remote access bytes - seconday days 3 502 Filler (12 bytes) 12 514 Prime days 1 Bits 0-7 toggled on represents primedays, respective to Mon, Tue, ..., Sun. 515 Filler (1 byte) 1 516 Default base priority 1 517 Maximum job queue priority 1 518 Active process limit 2 520 Max. number of interactive, detached, and batch jobs 2 524 Detached process limit 2 526 Subprocess creation limit 2 528 Buffered I/O count 2 530 Timer queue entry limit 2 532 AST queue limit 2 534 Lock queue limit 2 536 Open file limit 4 538 Shared file limit 2 540 Working set quota 4 548 Working set extent 4 552 Paging file quota 4 556 Maximum CPU time limit (in 10-milliseconds) 4 560 Buffered I/O byte limit 4 564 Paged buffer I/O byte count limit 4 568 Initial byte quota (jobwide logical name table uses) 4 572 Filler (72 bytes) 72 Dates and times are stored as 8 bytes representing the number of seconds elapsed since November 17, 1858, 12:00:00 a.m. Earlier versions of the VMS UAF will contain much of the same data, which should be at the same offset as listed above. Should you decide to attempt to modify the SYSUAF.DAT file, keep in mind that if you download the file, when you upload it, it will not be the same as it was before; it will not be an indexed file. You *might* be able to create an .FDL file (using ANALYZE/RMS/FDL SYSUAF.DAT), and use that .FDL file to convert it back to an indexed file (with CONVERT/FDL=SYSUAF.FDL UPLOAD_UAF.DAT NEW_UAF.DAT), but chances that it will contain the proper indexing and file attributes are slim. Remember when altering the SYSUAF.DAT file to keep a copy around (on the system) in case you need to repair the damage. -PHz Feel free to make any comments or corrections to the following address: [phz@judy.indstate.edu] _______________________________________________________________________________ Downloaded From P-80 International Information Systems 304-744-2253 12yrs+